結合以前的學習筆記以及參考《Objective-C編程全解(第三版)》,對Objective-C知識點進行梳理總結。css
知識點一直在變。僅僅是做爲參考。以蘋果官方文檔爲準~編程
十9、通知-消息發送模式之中的一個markdown
一、幾個基本概念
(1)通知:在面向對象的程序中。有時需要將發生的時間通知給多個對象的消息發送模式;
(2)通知中心:指望取得通知的對象預先向通知中心註冊指望取得的通知;
(3)發送:某對象向通知中心發送消息發送請求,僅僅有註冊過該通知單額對象,均可得到通知中心推送的消息;
(4)觀察者:消息發送目標,在通知中心註冊的對象(可以有多個)。
(5)多播:某個對象向特定的多個對象發送消息,通知就是多播的一種post
二、通知對象:向通知中心發送消息,必要的信息會在NSNotification類實例中集中後發送給通知中心學習
+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject;
+ (instancetype)notificationWithName:(NSString *)aName
object:(id)anObject
userInfo:(NSDictionary *)aUserInfo;
變量說明:
aName:識別通知的短文本。向NSNotification接口發送例如如下消息可取出名字
anObject:和通知一塊兒發送的附帶信息的對象,多爲發送通知的對象,也可爲nil
userInfo:傳遞和通知相關的各類信息,也可爲nilui
三、通知中心NSNotificationCenter
(1)系統有默認的通知中心。通常不用本身建立。spa
類方法獲取指針
+ (NSNotificationCenter *)defaultCenter;
[NSNotificationCenter defaultCenter];
(2)通知發送code
- (void)postNotification:(NSNotification *)notification; - (void)postNotificationName:(NSString *)aName object:(id)anObject; - (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;
指定通知名、對象和用戶字典生成通知。而後發送給接收者的通知中心server
(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觀察者及發送元對象。所以釋放這些對象以前。要確實從通知中心刪除相關設置。
不然指向釋放對象的指針會變成空指針。(即要remove)
(2)在垃圾回收機制時。通知者和發送源對象會使用弱引用在通知中心註冊。
無論是否註冊,均可能被回收釋放。
無需顯式刪除觀察者的註冊;
我我的簡單地理解一下。就是如下幾句白話~
(1)通知中心有默認的。不要糾結它究竟在哪裏,要不要建立。僅僅要抓好發送通知和觀察者就可以。
(2)可以有多個觀察者。註冊即是。
(3)通知對象可以不用創立,直接發送通知就可以了。
(4)觀察者的地方add。remove;
(5)name爲nil,可以接受所有發送的通知
這部分的代碼樣例。請參考下一篇 「通知模式實現兩個textField傳值及模態視圖——iOS開發」