1 前言
在IOS開發中,相信大家一定聽說過委託,資料來源,target,action等等,今天我們就來簡單的學習一下這些內容。
2 詳述2.1 委託和資料來源
大家是否曾經有不知道如何去執行一項任務的時候?或許是修理一台洗碗機或者補一雙襪子。你可以學者自己做,或者找人幫你完成你不懂的地方,這就是委託。
委託(delegation)的設計模式,可以讓你的程式實現系統類別定義好的介面。其工作方式:把一個對象介紹給另一個可以回答任何問題的對象。通過分配一個delegate,你可以在代碼定義相關的介面來相應請求或者狀態的變化。
如果我們的對象想要成為一個委派物件,它需要按照一定的協議來實現。協議好比是一個合約,許多在合約中的方法都是可選的,但是其他的方法是必須實現的。
例如查看一個使用委託的類:UIPickerView控制項--用來從滾動列表中選取值。
查看UIPickerView類的文檔,我們會發現執行個體變數以如下形式定義:
@property(nonatomic,assign) id<UIPickerViewDataSource> dataSource;
這一聲明說明,支援UIPickerViewDelegate協議的任何類(由id聲明)都可以使用UIPickerView的委託。
2.2 目標和操作
而資料來源則是需要顯示的資料,作為委託,一個名為dataSource的執行個體變數必須在UIPickerViewDataSource協議中實現。
@property(nonatomic,assign) id<UIPickerViewDelegate> delegate;
在處理Cocoa Touch中的控制項時候,當點擊按鈕,拖動滑塊調節音量,這些元素需要通知應用程式中的其他部分,它的狀態改變了。
其通過的是 target-action設計模式。換句話說,為每個控制項設定一個target對象,用來接受改變的通知。像委託一樣,你可以選擇任何的對象。
和委託不同的地方在於,動作可以使對象定義的任何方法,只需要符合下面兩個簽名之一:
-(IBAction)actionOne{
}
-(IBAction)actionTwo:(id)sender{
}
Interface Builder使用IBAction來確定代碼中的動作。第二種形式包含一種參數,該參數是發起動作的對象。在處理動作的時候,sender可能會使用到。
2.2.1 手動添加目標對象及方法
在Cocoa Touch中的每一個控制項都是UIController的子類,該類定義了一下的方法:
-(void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents
該方法有三個參數,第一個是目標對象,用來接受事件活動通知。第二個是動作參數,該參數定義的訊息將會發送到目標對象。第三個是controlEvents,用與指定觸發執行動作的事件類型。
例如:UIControlEventValueChanged和UIEventTouchUpInside。
2.3 深入瞭解視圖的生命週期
檔案中的方法用 IBAction,屬性用 IBOutlet與IB(Interface Builder)關聯,例如:
@property(nonatomic,retain)IBOutlet UIButton *myButton;
他們會與.xib檔案相關聯,她的前身是NIB檔案,“NeXT Interface Builder”的縮寫,因為現在新的xib檔案是基於XML的,所以改為xib。
NIB的載入機制使用訪問器來設定這些執行個體方法變數,會使用內容存的對象來調用-setMyButton:方法。
被載入的對象擁有你在IB中做的所有設定。如果你改變了視圖的背景顏色,這一變化將會記錄在記憶體中,兵器你的執行個體變數會去訪問它。
一個對象從NIB檔案讀取後,會發送一條-awakeFromNib訊息,但是不能用於初始化資訊在這個方法裡面,因為此時視圖還沒有載入,UIVIew採用的是消極式載入技術,我們可以覆蓋-viewDidLoad方法。
Cocoa Touch不僅會消極式載入,還可以在記憶體不足的時候將其自動移除。架構知道哪些是當前顯示的視圖,並會安全回收哪些不可見的視圖。做這個處理時,它會發送訊息給視圖控制器,讓你知道呢那日不足了。
-(void)didReceiveMemoryWarning 方法。
如果我們的視圖依賴於大緩衝的資訊或者其他易於重建的資料,那麼didReceiveMemoryWarning方法使用來清除這些對象的很好方式。
可以重寫-viewDidUnload方法,設定我們的執行個體變數,讓他們為空白。
-(void)viewDidUnload{
self.myButton = nil;
[super viewDidUnload];
}
這裡有一個細節:-viewDidLoad和-viewDidUnload方法可以唄多次調用,從而避免了初始化只可執行一次的問題。
不一定要使用NIB檔案繪製圖層,可以覆蓋-loadView方法,然後用-addSubView:方法將他們添加到主視圖中去。
最後,由於NIB載入器會保留儲存在記憶體中的介面對象,所以你還要做最後一件事:當試圖控制器銷毀時,需要釋放這些視圖。
-(void)dealloc{
[myButton release];
[super dealloc];
}
3 結語
以上是所有內容,希望對大家有所協助。