нераспознанный селектор при попытке прослушивания UIApplicationDidReceiveMemoryWarningNotification

У меня есть "статический" класс, который я хочу иметь возможность реагировать на предупреждения о нехватке памяти. Однако, когда я запускаю предупреждение о нехватке памяти вручную из симулятора, я получаю сообщение об ошибке «неопознанный селектор».

Соответствующий код:

@interface MyClass : NSObject
+ (void) receiveNotification:(NSNotification*) notification;
@end 

@implementation MyClass
+ (void) initialize {
    [super initialize];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification) name:@"UIApplicationDidReceiveMemoryWarningNotification" object:nil];
}
+ (void) receiveNotification:(NSNotification*) notification {
    // Breakpoint here never hits.
    // I instead receive error "+[MyClass receiveNotification]: unrecognized selector sent to class".
}
@end

person DuckMaestro    schedule 10.06.2012    source источник


Ответы (1)


Имя вашего метода receiveNotification: (обратите внимание, что двоеточие является частью имени)

Таким образом, селектор должен быть @selector(receiveNotification:)

РЕДАКТИРОВАТЬ: кстати, я бы не стал вызывать [super initialize] в инициализаторе класса. Точно так же вы должны остерегаться подкласса, заставляющего этот инициализатор, который вы написали, вызываться дважды. См. этот очень хороший пост от Майка Эша, чтобы узнать больше об этом: загрузка и инициализация класса

Надеюсь, это поможет.

person Firoze Lafeer    schedule 10.06.2012
comment
Ах. Это сделало это. Странно - почему не было бы ошибки времени компиляции, чтобы поймать эту ошибку? - person DuckMaestro; 10.06.2012
comment
Потому что компилятор не может знать, что @selector(receiveNotification) не тот, который вам нужен. Селектор не привязан к конкретному классу, поэтому, насколько ему известно, его может реализовать какой-то другой класс. Или ваш класс может реализовать его в какой-то другой единице компиляции или даже добавить этот метод во время выполнения. Компилятор также не может знать, что наблюдатель, переданный -addObserver:selector:name:object:, должен реализовать аргумент селектора — Objective-C не предоставляет никакого способа сообщить компилятору об этом отношении. - person Kurt Revis; 10.06.2012