неразпознат селектор при опит за слушане за 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