NSNotification用法簡介

Poster.h

//定義一個string常量,用於notification

extern NSString * const PosterDidSomethingNotification;

//與extern const NSString *PosterDidSomethingNotification 的區別

//前者是一個指向immutable string的常量指針。後者是一個指向immutable string的可變指針。
Poster.m

NSString *const PosterDidSomethingNotification = @"PosterDidSomethingNotification";

...

//在notification 中包含 poster

[[NSNotificationCenter defaultCenter] postNotificationName:PosterDidSomethingNotification

                                                                       object:self];
Observer.m

//import Poster.h

#import "Poster.h"

...

//註冊能夠接受的notification

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(posterDidSomething:)

                                                   name:PosterDidSomethingNotification  object:nil];

...

-(void) posterDidSomething:(NSNotification *)note{

    //處理notification

}

-(void)dealloc{

    //必定要刪除observations

    [[NSNotificationCenter defaultCenter] removeObserver:self];

    [super dealloc];

}

Observer 應該認真考慮是應該observe一個特定對象仍是nil(指定名稱的全部notifications,而無論object的值)。若是observe一個特定的實例,這個實例應該是retain的實例變量。 app

Observing 一個已經deallocate的對象不會引發程序crash,可是notifying 一個已經deallocated 的observer會引發程序的crash。這就是爲何要在dealloc 中加入removeObserver:。因此addObserver與 removeObserver必定要成對出現。通常狀況下,在init方法中開始observing, 在dealloc中結束observing。 post

-(void)setPoster:(Poster *)aPoster{

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];

if (_poster != nil){

    //刪掉全部舊值的oberservations

    [nc removeObserver:self name:nil object:_poster];

    //nil 意味着「any object」 或者"any notification"

    _poster = aPoster;

    if (_poster != nil){

        [nc addObserver:self selector:@selector(anEventDidHappen:) name:PosterDidSomthingNotification object:_poster];

    }

}
相關文章
相關標籤/搜索