iPhone App開發實戰手冊學習筆記(5)之IOS常用機制

來源:互聯網
上載者:User
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 結語

以上是所有內容,希望對大家有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.