Могу ли я зарегистрировать класс для NSNotifications? Могу ли я использовать методы класса с NSNotifications? - PullRequest
7 голосов
/ 16 февраля 2012

Я работаю над классом для своего приложения для iPhone, и я хочу, чтобы он зарегистрировался и был в курсе изменений состояния приложения (UIApplicationDidEnterBackgroundNotification и т. Д.).Есть ли способ зарегистрировать класс для уведомлений без необходимости хранить экземпляр объекта в памяти?Я просто хочу, чтобы соответствующие уведомления вызывали класс для инициализации, делали что-то и затем оставляли память снова.

Прямо сейчас у меня есть следующее в методе инициализации:

[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(handleEnteredBackground) 
                                             name: UIApplicationDidEnterBackgroundNotification
                                           object: nil];

и этот метод в другом месте в файле .m класса:

- (void) handleEnteredBackground {
    NSLog(@"Entered Background"); }

Я создаю экземпляр класса один раз под applicationDidLoad, но так как я ничего с ним не делаю, я предполагаю, что ARC убивает объект из памятии приложение вылетает (без каких-либо полезных кодов ошибок, заметьте), когда я иду, чтобы закрыть его.Если я переключаю handleEnteredBackground на метод класса со знаком «+», я получаю недопустимые ошибки селектора при закрытии приложения.

Конечная цель - создать экземпляр класса один раз в жизненном цикле приложения ииметь возможность реагировать на изменения состояния приложения без дополнительного кода вне класса.Предположим, iOS 5 + Xcode 4.2 +

Ответы [ 2 ]

19 голосов
/ 16 февраля 2012

Должно работать следующее:

[[NSNotificationCenter defaultCenter] addObserver: [self class]
                                         selector: @selector(handleEnteredBackground:) 
                                             name: UIApplicationDidEnterBackgroundNotification
                                           object: nil];

Сам селектор:

+ (void) handleEnteredBackground: (NSNotification *) notification
{
}

Вам не нужно отменять регистрацию наблюдателя, поскольку объект класса не может быть освобожден или иным образом уничтожен,Если вам необходимо отменить регистрацию наблюдателя по другим причинам, вы можете:

[[NSNotificationCenter defaultCenter] removeObserver: [self class]];
3 голосов
/ 16 февраля 2012

Вы должны посмотреть на синглетоны .

Вы можете легко создать объект, который длится весь жизненный цикл приложения.

+ (id)sharedObserver
{
    static dispatch_once_t once;
    static YourObserverClass *sharedObserver = nil;

    dispatch_once(&once, ^{ 
        sharedObserver = [[self alloc] init]; 
    });

    return sharedObserver;
}
- (void)startObserving
{
    // Add as observer here
}

Теперь вы можете вызывать [[YourObserverClass sharedObserver] startObserving] и вам не нужно беспокоиться о его сохранении и т. Д.

...