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]; } }