天天看點

通知機制的使用通知中心(NSNotificationCenter) 通知(NSNotification)釋出通知 注冊通知監聽器取消注冊通知監聽器 通知和代理的選擇

通知中心(NSNotificationCenter)

•每一個應用程式都有一個通知中心(NSNotificationCenter)執行個體,專門負責協助不同對象之間的消息通信 任何一個對象都可以向通知中心釋出通知(NSNotification),描述自己在做什麼。其他感興趣的對象(Observer)可以申請在某個特定通知釋出時(或在某個特定的對象釋出通知時)收到這個通知

通知機制的使用通知中心(NSNotificationCenter) 通知(NSNotification)釋出通知 注冊通知監聽器取消注冊通知監聽器 通知和代理的選擇

通知(NSNotification)

一個完整的通知一般包含3個屬性: - ( NSString*)name; / / 通知的名稱 - ( id)object; // 通知釋出者 ( 是誰要釋出通知 ) - ( NSDictionary*)userInfo; // 一些額外的資訊 ( 通知釋出者傳遞給通知接收者的資訊内容 ) 初始化一個通知(NSNotification)對象 + ( instancetype)notificationWithName:( NSString*)aName object:( id)anObject; + ( instancetype)notificationWithName:( NSString*)aName object:( id)anObjectuserInfo:( NSDictionary*)aUserInfo; - ( instancetype)initWithName:( NSString*)name object:( id)objectuserInfo:( NSDictionary *)userInfo;

釋出通知

通知中心(NSNotificationCenter)提供了相應的方法來幫助釋出通知

- ( void)postNotification:( NSNotification*)notification; 釋出一個notification通知,可在notification對象中設定 通知的名稱、 通知釋出者、 額外資訊等 - ( void)postNotificationName:( NSString*)aName object:( id)anObject; 釋出一個名稱為aName的通知,anObject為這個通知的釋出者 - ( void)postNotificationName:( NSString*)aName object:( id)anObjectuserInfo:( NSDictionary*)aUserInfo; 釋出一個名稱為aName的通知,anObject為這個通知的釋出者,aUserInfo為額外資訊

注冊通知監聽器

通知中心(NSNotificationCenter)提供了方法來注冊一個監聽通知的監聽器(Observer)

- ( void)addObserver:( id)observerselector:( SEL)aSelectorname:( NSString*)aName object:( id)anObject; observer:監聽器,即誰要接收這個通知 aSelector:收到通知後,回調監聽器的這個方法, 并且把通知對象當做參數傳入 aName:通知的名稱。如果為nil,那麼無論通知的名稱是什麼,監聽器都能收到這個通知 anObject:通知釋出者。如果為anObject和aName都為nil,監聽器都收到所有的通知

取消注冊通知監聽器

通知中心不會保留(retain)監聽器對象,在通知中心注冊過的對象, 必須在該對象釋放前取消注冊。否則,當相應的通知再次出現時,通知中心仍然會向該監聽器發送消息。因為相應的監聽器對象已經被釋放了,是以可能會導緻應用崩潰 通知中心提供了相應的方法來取消注冊監聽器 - ( void)removeObserver:( id)observer; - ( void)removeObserver:( id)observername:( NSString*)aName object:( id)anObject; 一般在監聽器銷毀之前取消注冊(如在監聽器中加入下列代碼):

- (void)dealloc{

  //[superdealloc]; 非ARC中需要調用此句

   [[NSNotificationCenter defaultCenter] removeObserver:self];

}

通知和代理的選擇

共同點 利用通知和代理都能完成對象之間的通信

(比如A對象告訴D對象發生了什麼事情,A對象傳遞資料給D對象)

不同點 代理 :一對一關系( 1 個對象隻能告訴 另 1 個對象發生了什麼事情) 通知 :多對多關系( 1 個對象能告訴 N 個對象發生了什麼事情, 1 個對 象能得知 N 個對象發生了什麼事情)