2

У меня есть класс ParentClass, который соблюдает NSNotification. ParentClass обрабатывает уведомление. ChildClass наследует ParentClass, а также обрабатывает уведомление. Является ли порядок доставки уведомлений детерминированным?NSNotification наблюдается в суперклассе и обрабатывается в супер-и дочернем классе

Иными словами, ParentClass всегда обрабатывает уведомление до ChildClass или наоборот?

ответ

2

Это зависит от того, какие классы создаются и как формируются фактические объекты. Это также зависит от того, подходит ли подкласс для обработки. В противном случае, как говорят документы NSNotificationCenter, порядок объектов, получающих уведомления, является случайным и НЕ зависит от того, какой вы подкласс или суперкласс. Рассмотрим следующие образцы для лучшего понимания: (несколько примеров необходимы, как ваш экспликация не совсем понятно):

Пример 1: два разных объекта

ParentClass *obj1 = [[ParentClass alloc] init]; 
ChildClass *obj2 = [[ChildClass alloc] init]; 
// register both of them as listeners for NSNotificationCenter 
// ... 
// and now their order of receiving the notifications is non-deterministic, as they're two different instances 

Пример 2: подкласс называет супер

@implementation ParentClass 

- (void) handleNotification:(NSNotification *)not 
{ 
    // handle notification 
} 

@end 

@ipmlementation ChildClass 

- (void) handleNotification:(NSNotification *)not 
{ 
    // call super 
    [super handleNotification:not]; 
    // actually handle notification 
    // now the parent class' method will be called FIRST, as there's one actual instace, and ChildClass first passes the method onto ParentClass 
} 

@end 
+0

Методы действия уведомления должны иметь один параметр - объект уведомления. –

+1

@JoshCaswell, это правда? Я думал, что если вы пропустили двоеточие после имени селектора при регистрации, что вам не нужен параметр. Я не могу проверить это только сейчас ... –

+0

@Josh Caswell nope. Если вы объявите метод с меньшими аргументами по мере необходимости, это не проблема. Из-за соглашения о вызове функции C параметры находятся в верхней части стека при вызове, а функция может вызывать их по одному, пока не «закончится аргумент». Таким образом, единственная истинная проблема заключается в том, что вы используете больше аргументов, чем это возможно. –

 Смежные вопросы

  • Нет связанных вопросов^_^