天天看點

iPhone App開發實戰手冊學習筆記(6)之通知1 前言2 詳述3 結語

1 前言

Cocoa Touch提供了一個機制,可以通知你的應用程式所發生的變化,例如:iPhone上鎖和解鎖變化,裝置方向變化,使用者界面元素觸發鍵盤在螢幕上顯示,電池電量水準的變化或者裝置的連接配接,文本編輯視圖的更新,剪切闆的變化等,以上僅僅是UIApplication,UIWindow,UIDevice,UITextView和UIPasteboard生成的,标準的命名結尾一般都是Notification。今天我們就來學習一下通知機制。

2 詳述

2.1 應用程式通知

想讓我們的程式被通知到,需要提供一個對象,一個選擇器,以及通知的名稱。有個成為NSNotificationCenter的中央服務用來在那些産生通知的對象和需要接受通知的對象之間傳輸資訊,分發的對象是NSNotification類的執行個體。

通知中心的行為好比郵局,通知本身就是信件。

如果想要收到系統事件的通知,你要先告訴通知中心關于自己的資訊。

例如你想知道你的應用程式合适被運作或者解鎖:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(becomeActive:) name:UIApplicationDidBecomeActicveNotification object:nil];

第一個參數是self,用來告訴通知中心這個視圖控制器将處理通知。選擇器becomeActive制定了要發送到視圖控制器的消息,name說明了控制器的意圖。object參數在這個例子中沒有使用,它用來表示通知的發送者。nil表示要接受這種類型的所有通知,而不管它來自哪個對象。

這樣當使用者可以進行界面操作時,UIApplicationDidBecomeActiveNotification就會被傳遞給控制器來進行處理。

如果視圖控制器不再需要知道這些事件,那麼應該告訴通知中心,這是非常重要的。如果不這麼做,你的應用程式可能會崩潰,原因是:一個通知被觸發并執行相關的操作,但是如果注冊的對象被釋放了,而通知還會被發送到你剛才釋放的對象上,這樣記憶體調用就會出錯。

解決辦法就是確定每一個 -addObserver: 都對應一個-removeObserver:。也可以使用-removeObserver:一次性移除所有的通知。

觀察者是在對象初始化時候添加的,是以在-dealloc:中将其移除。

-(void)dealloc{

...

[[NSNotificationCenter defaultCenter] removeObserver:self];

[super dealloc];

}

2.2 自定義通知

通知的名字隻是一個字元串對象,在類的接口聲明中需要這樣定義:

extern NSString* MyConnectionDidFinishNotification;

在對象中,需要定義通知名稱

NSString* MyConnectionDidFinishNotification = @"MyConnectionDidFinishNotification";

需要這樣送出通知:

[[NSNotificationCenter defaultCenter] postNotificationName:MyConnectionDidFinishNotification object:self];

在應用程式中任何對象都可以調用MyConnectionDidFinishNotification的 -addObserver 方法來得到消息,然後就可以更新視圖,控制器和模型了。

3 結語

以上是所有内容,希望對大家有所幫助。