Notification(一)系統通知的監聽移除

對象間的通訊以一種盲目結構進行,也就是MVC的廣播站機制,在iOS7裏叫作Notification通知數據庫

  1. 獲取通知中心共享實例: [NSNotificationCenter defaultCenter]安全

  2. 收聽系統廣播:addObserver;app

  3. 關閉廣播:removeObserver(很重要)指針

    [center removeObserver:self];code

    ororm

    [center removeObserver:self name:UIContentSizeCategoryDidChangeNotification object:nil];
    • 若是不關閉廣播,通知中心始終用一個指針指向你,叫作Unsafe retained不安全保留。指針類型不是強或弱而是不安全保留類型。不安全保留類型指的是若是沒有調用它就離開了堆,通知中心可能會試着給你發送一個通知,而後應用就崩了。
    • 使用不安全保留指針的緣由:爲了向後兼容,這裏實際上應該是弱類型,若是是弱指針,你離開了堆,通知中心會設置爲nil,毫不會再向你發送任何消息了。將指針自動設爲nil的這種弱指針機制是iOS6和iOS7中特有的。若是運行在iOS5上就不會起做用,我相信最終他們也許會將它們設爲弱類型。
      *總之,結束收聽廣播以後,要移除本身。一般狀況下,在你的MVC離開屏幕後,就要移除本身。一般只有在MVC處於激活狀態出如今屏幕上的時候,你纔會關注廣播消息。
  4. dealloc: 會在你的對象將要離開堆前被調用,全部屬性都爲nil,幾乎已經再也不是一個對象的時候 調用這個方法。是最後的關聯。因此也能夠在這裏解決不安全保留指針的問題。可是不建議使用server

  5. 使用數據庫構建更復雜模型的時候,介紹如何使用廣播站機制來監聽模型的變化(後面介紹)對象

eg.收聽廣播
- (void)addObserver:(id)observer // 想要收聽廣播的對象(self當前控制器)
            <!--當廣播上出現內容時會調用它-->
            selector:(SEL)methodToInvokeIfSomethingHappens
                <!--name是廣播站的名稱-->
                name:(NSString *)name 
                <!--你是否只想收聽某個特定對象發出的廣播(nil表示頻率上任何廣播)-->
                object:(id)sender;
eg.出現廣播調用的方法
- (void)methodToInvokeIfSomethingHappens:(NSNotification *)notification
{
    <!--廣播站的名字,和上面的參數同樣-->
    notification.name
    <!--object 就是向你發送這個通知的對象-->
    notification.object 
    <!--userInfo是取決於廣播站發出的信息-->
    notification.userInfo // notification-specific information about what happened
}
ps:userInfo你想知道是什麼,能夠用isKindOfClass或者respondsToSelector等來使用它
eg.dealloc
<!--注意:該方法裏不能訪問屬性,由於此時屬性已經從堆中移除-->
- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
相關文章
相關標籤/搜索