本地通知
推送通知
通知中心
三者之間並沒有什麼直接性質的聯系,通知中心是向應用程序中注冊某個觀察者的所有對象廣播消息,通過通知中心可以很好的協調不同對象之間的消息通信。
每一個應用程序都有且只有一個通知中心(NSNotificationCenter)實例
代理對應的關系的一對一的關系,而通知是一對多的關系,所以在遇到需要一處改變引起多出
變化的功能上我們最好選擇通知。
QQ音樂App上換皮膚效果
讀書軟件改變字體大小效果
在實際開發中合理的使用二者,防止大材小用
通知發布者
通知中心
通知接收者
name:通知的名稱
object:通知的發布者
userInfo:通知者給通知接收者的信息內容
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSString *)aName object:(nullable id)anObject;
observer:監聽器,即誰要接收這個通知
aSelector:收到通知後,回調監聽器的這個方法,並且把通知對象當做參數傳入
aName:通知的名稱。如果為nil,那麼無論通知的名稱是什麼,監聽器都能收到這個通知
anObject:通知發布者。如果為anObject和aName都為nil,監聽器都收到所有的通知
? - (void)postNotification:(NSNotification *)notification;
? - (void)postNotificationName:(NSString *)aName object: (id)anObject;
? - (void)postNotificationName:(NSString *)aName object:(id)anObject
userInfo:(NSDictionary *)aUserInfo;
我們在通知中心注冊完後,通知中心是非常靈敏的,當條件被觸發後就會不斷的向注冊者發送消息,但當我們的注冊者已經被釋放了,這時候就會造成野指針,引發程序崩潰,所以在我們對象被釋放的時候,應該把該對象向通知中心注冊的通知釋放掉。
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)removeObserver:(id)observer;
- (void)removeObserver:(id)observer name:(nullable NSString *)aName object:(nullable id)anObject;
//第二個多了一個name的參數可以具體到該對象中某個通知
1. 設備旋轉
UIDeviceOrientationDidChangeNotification
2. 鍵盤操作
UIKeyboardWillShowNotification // 鍵盤即將顯示
UIKeyboardDidShowNotification // 鍵盤顯示完畢
UIKeyboardWillHideNotification // 鍵盤即將隱藏
UIKeyboardDidHideNotification // 鍵盤隱藏完畢
UIKeyboardWillChangeFrameNotification // 鍵盤的位置尺寸即將發生改變
UIKeyboardDidChangeFrameNotification // 鍵盤的位置尺寸改變完畢
通知的正常執行的順序為:接收者在通知中心注冊通知——>通知者在通知中心發布通知———>釋放通知中心的注冊通知。順序出錯將會產生錯誤。