iPhone App开发实战手册学习笔记(5)之IOS常用机制
1 前言
在IOS開發(fā)中,相信大家一定聽說過委托,數(shù)據(jù)源,target,action等等,今天我們就來簡單的學(xué)習(xí)一下這些內(nèi)容。
2 詳述
2.1 委托和數(shù)據(jù)源
大家是否曾經(jīng)有不知道如何去執(zhí)行一項任務(wù)的時候?或許是修理一臺洗碗機或者補一雙襪子。你可以學(xué)者自己做,或者找人幫你完成你不懂的地方,這就是委托。
委托(delegation)的設(shè)計模式,可以讓你的程序?qū)崿F(xiàn)系統(tǒng)類定義好的接口。其工作方式:把一個對象介紹給另一個可以回答任何問題的對象。通過分配一個delegate,你可以在代碼定義相關(guān)的接口來相應(yīng)請求或者狀態(tài)的變化。
如果我們的對象想要成為一個委托對象,它需要按照一定的協(xié)議來實現(xiàn)。協(xié)議好比是一個合同,許多在合同中的方法都是可選的,但是其他的方法是必須實現(xiàn)的。
例如查看一個使用委托的類:UIPickerView控件--用來從滾動列表中選取值。
查看UIPickerView類的文檔,我們會發(fā)現(xiàn)實例變量以如下形式定義:
?
@property(nonatomic,assign) id<UIPickerViewDataSource> dataSource;?
這一聲明說明,支持UIPickerViewDelegate協(xié)議的任何類(由id聲明)都可以使用UIPickerView的委托。
2.2 目標(biāo)和操作
?
而數(shù)據(jù)源則是需要顯示的數(shù)據(jù),作為委托,一個名為dataSource的實例變量必須在UIPickerViewDataSource協(xié)議中實現(xiàn)。
?
@property(nonatomic,assign) id<UIPickerViewDelegate> ? delegate; ?
在處理Cocoa Touch中的控件時候,當(dāng)點擊按鈕,拖動滑塊調(diào)節(jié)音量,這些元素需要通知應(yīng)用程序中的其他部分,它的狀態(tài)改變了。
其通過的是 target-action設(shè)計模式。換句話說,為每個控件設(shè)置一個target對象,用來接受改變的通知。像委托一樣,你可以選擇任何的對象。
和委托不同的地方在于,動作可以使對象定義的任何方法,只需要符合下面兩個簽名之一:
-(IBAction)actionOne{
}
-(IBAction)actionTwo:(id)sender{
}
Interface Builder使用IBAction來確定代碼中的動作。第二種形式包含一種參數(shù),該參數(shù)是發(fā)起動作的對象。在處理動作的時候,sender可能會使用到。
2.2.1 手動添加目標(biāo)對象及方法
在Cocoa Touch中的每一個控件都是UIController的子類,該類定義了一下的方法:
-(void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents
該方法有三個參數(shù),第一個是目標(biāo)對象,用來接受事件活動通知。第二個是動作參數(shù),該參數(shù)定義的消息將會發(fā)送到目標(biāo)對象。第三個是controlEvents,用與指定觸發(fā)執(zhí)行動作的事件類型。
例如:UIControlEventValueChanged和UIEventTouchUpInside。
2.3 深入了解視圖的生命周期
文件中的方法用 IBAction,屬性用 IBOutlet與IB(Interface Builder)關(guān)聯(lián),例如:
@property(nonatomic,retain)IBOutlet UIButton *myButton;
他們會與.xib文件相關(guān)聯(lián),她的前身是NIB文件,“NeXT Interface Builder”的縮寫,因為現(xiàn)在新的xib文件是基于XML的,所以改為xib。
NIB的加載機制使用訪問器來設(shè)置這些實例方法變量,會使用內(nèi)容存的對象來調(diào)用-setMyButton:方法。
被加載的對象擁有你在IB中做的所有設(shè)置。如果你改變了視圖的背景顏色,這一變化將會記錄在內(nèi)存中,兵器你的實例變量會去訪問它。
一個對象從NIB文件讀取后,會發(fā)送一條-awakeFromNib消息,但是不能用于初始化信息在這個方法里面,因為此時視圖還沒有加載,UIVIew采用的是延遲加載技術(shù),我們可以覆蓋-viewDidLoad方法。
Cocoa Touch不僅會延遲加載,還可以在內(nèi)存不足的時候?qū)⑵渥詣右瞥?蚣苤滥男┦钱?dāng)前顯示的視圖,并會安全回收哪些不可見的視圖。做這個處理時,它會發(fā)送消息給視圖控制器,讓你知道呢那日不足了。
-(void)didReceiveMemoryWarning 方法。
如果我們的視圖依賴于大緩存的信息或者其他易于重建的數(shù)據(jù),那么didReceiveMemoryWarning方法使用來清除這些對象的很好方式。
可以重寫-viewDidUnload方法,設(shè)置我們的實例變量,讓他們?yōu)榭铡?/span>
-(void)viewDidUnload{
self.myButton = nil;
[super viewDidUnload];
}
這里有一個細(xì)節(jié):-viewDidLoad和-viewDidUnload方法可以唄多次調(diào)用,從而避免了初始化只可執(zhí)行一次的問題。
不一定要使用NIB文件繪制圖層,可以覆蓋-loadView方法,然后用-addSubView:方法將他們添加到主視圖中去。
最后,由于NIB加載器會保留存儲在內(nèi)存中的接口對象,所以你還要做最后一件事:當(dāng)試圖控制器銷毀時,需要釋放這些視圖。
-(void)dealloc{
[myButton release];
? ? ? ?[super dealloc];
}
3 結(jié)語
以上是所有內(nèi)容,希望對大家有所幫助。
?
轉(zhuǎn)載于:https://www.cnblogs.com/dyllove98/archive/2013/06/06/3122915.html
總結(jié)
以上是生活随笔為你收集整理的iPhone App开发实战手册学习笔记(5)之IOS常用机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个肾结石微创手术要多少钱
- 下一篇: Xt800、DEFY自带号码归属地更新包