Objective-C(十九、通知-訊息發送模式之一)——iOS開發基礎,objective-cios
結合之前的學習筆記以及參考《Objective-C編程全解(第三版)》,對Objective-C知識點進行梳理總結。知識點一直在變,只是作為參考,以蘋果官方文檔為準~
十九、通知-訊息發送模式之一
1、幾個基本概念
(1)通知:在物件導向的程式中,有時需要將發生的時間通知給多個對象的訊息發送模式;
(2)通知中樞:期望取得通知的對象預先向通知中樞註冊期望取得的通知;
(3)發送:某對象向通知中樞發送訊息發送請求,只有註冊過該通知單額對象,都可獲得通知中樞推送的訊息;
(4)觀察者:訊息發送目標,在通知中樞註冊的對象(可以有多個);
(5)多播:某個對象向特定的多個對象發送訊息,通知就是多播的一種
2、通知對象:向通知中樞發送訊息,必要的資訊會在NSNotification類執行個體中集中後發送給通知中樞
+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject;+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;
變數說明:
aName:識別通知的短文本,向NSNotification介面發送如下訊息可取出名字
anObject:和通知一起發送的附帶資訊的對象,多為發送通知的對象,也可為nil
userInfo:傳遞和通知相關的各種資訊,也可為nil
3、通知中樞NSNotificationCenter
(1)系統有預設的通知中樞,一般不用自己建立。類方法擷取
+ (NSNotificationCenter *)defaultCenter;[NSNotificationCenter defaultCenter];
(2)通知發送
- (void)postNotification:(NSNotification *)notification;- (void)postNotificationName:(NSString *)aName object:(id)anObject;- (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;
指定通知名、對象和使用者字典組建通知,然後發送給接收者的通知中樞
(3)觀察者註冊
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;
變數說明:
observer:通知的監聽者
aSelector:收到通知後,會調用observer的此方法。
aName:通知名,當不為nil時,只接受特定對象發送的通知;如果未nil表示沒有設定的發送源;
object:通知的寄件者
僅指定特定的多個通知名的通知時,可以將各個通知名分別在通知中樞註冊,或者指定通知名為nil使其發送有關所有通知名的訊息,並在接收後只處理必要的訊息;兩者都為nil則可以接收所有關於發送訊息的通知(這是書上原話)
(4)刪除觀察者的註冊
- (void)removeObserver:(id)observer;- (void)removeObserver:(id)observer name:(NSString *)aName object:(id)anObject;[NSNotificationCenter defaultCenter] removeObserver:obj];
(5)關於記憶體管理
(1)在引用計數管理的情況下,通知中樞在註冊觀察者時,並不retain觀察者及發送元對象。因此釋放這些對象之前,要確實從通知中樞刪除相關設定。否則指向釋放對象的指標會變成null 指標;(即要remove)
(2)在記憶體回收機制時,通知者和發送來源物件會使用弱引用在通知中樞註冊。無論是否註冊,都可能被回收釋放。無需顯式刪除觀察者的註冊;
我個人簡單地理解一下,就是下面幾句白話~
(1)通知中樞有預設的,不要糾結它到底在哪裡,要不要建立,只要抓好發送通知和觀察者就可以;
(2)可以有多個觀察者,註冊便是;
(3)通知對象可以不用創立,直接發送通知就可以了;
(4)觀察者的地方add,remove;
(5)name為nil,可以接受所有發送的通知
這部分的代碼例子,請參考下一篇
“通知模式實現兩個textField傳值及模態視圖——iOS開發”
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。