Cocoa基本原理指南中對象建立的內容是本文要介紹的內容,Cocoa對象的建立總是分成兩個階段:對象分配和初始化。Cocoa會從應用程式的虛存區中為對象分配足夠的記憶體。在計算需要分配多少記憶體時,Cocoa會考慮對象的執行個體變數,包括它們的類型和順序,這些資訊由對象的類來定義。為了進行對象分配,您需要向對象的類發送alloc或allocWithZone:訊息。
在訊息的傳回值中可以得到一個“生的”未初始化的)類執行個體。alloc方法使用應用程式預設的虛存區。區是一個按頁對齊的記憶體地區,用於存放應用程式分配的對象和資料。
除了分配記憶體之外,Cocoa的分配allocation)訊息還進行其它一些重要的工作:
- <!--[if !supportLists]-->§ <!--[endif]-->將對象的保持數設定為1。
- <!--[if !supportLists]-->§ <!--[endif]-->使初始化對象的isa執行個體變數指向對象的類。對象類是一個根據類定義編譯得到的運行時對象。
- <!--[if !supportLists]-->§ <!--[endif]-->將其它所有的執行個體變數初始化為0或者與0等價的類型,比如nil、NULL、和0.0)。
對象的isa執行個體變數是從NSObject繼承下來的,因此所有的Cocoa對象都有。在將isa指標指向對象類之後,對象就被整合到繼承層次的運行時視圖和構成程式的對象類和執行個體)網路中了。其結果是對象可以找到它所需要的所有運行時資訊,比如其它對象在繼承層次上的位置,它們遵循的協議,以及在響應訊息時可以執行的方法實現的位置。
初始化過程將對象的執行個體變數設定為合理而有用的初始值,還可以分配和準備對象需要的其它全域資源,並在必要時裝載諸如檔案這樣的資源。聲明執行個體變數的所有對象都應該實現一個初始化方法-除非將所有變數都置為0的預設初始化已經足夠。如果一個對象沒有實現自己的初始化方法,Cocoa就會調用其最近的祖先對象的方法。
NSObject聲明了init方法作為初始化方法的原型,它是一個執行個體方法,返回一個類型為id的對象。對於不需要初始化其它資料的子類,重載init方法就可以了,但是常見的情況是初始化階段需要根據外部的資料來設定對象的初始狀態。唯一的要求是初始化方法必須以“init”字母開頭有時用格式規則描述init...來表示初始化方法)。從初始化方法返回nil表示不能建立被請求的對象。在建立對象時,通常應該在處理之前檢查傳回值是否為nil。一旦對象被初始化了,就不應該再進行初始化。如果您試圖進行重複初始化,執行個體化對象的架構類通常會產生一個例外。
實現一個init... 方法,使之作為類的唯一初始化方法或者具有多個初始化方法的類的指定初始化方法時參見"多個初始化方法和指定初始化方法"部分的描述),有如下幾個關鍵步驟:
- <!--[if !supportLists]-->§ <!--[endif]-->總是首先調用超類super)的初始化方法。
- <!--[if !supportLists]-->§ <!--[endif]-->檢查超類返回的對象。如果是nil,則初始化不能進行,需要向接收者對象返回nil。
- <!--[if !supportLists]-->§ <!--[endif]-->在初始化執行個體變數時,如果它們是其它對象的引用,則在必要時進行保留和拷貝。
- <!--[if !supportLists]-->§ <!--[endif]-->將執行個體變數設定為正當的初始值之後,就返回self,除了下列的情況:
- <!--[if !supportLists]-->§ <!--[endif]-->需要返回一個代替對象,在這種情況下,首先釋放新分配的對象。
- <!--[if !supportLists]-->§ <!--[endif]-->某些問題導致不能成功初始化,這時需要返回nil。
在很多方面,一個類的dealloc方法都是和init... 方法特別是指定初始化方法)相呼應的。初始化方法在對象分配之後馬上被調用,而dealloc在對象的銷毀之前被調用;初始化方法確保對象的執行個體變數被正確初始化,而dealloc方法確保該對象的執行個體變數被釋放,以及確保動態分配的記憶體被釋放。
兩者的最後一點相似之處在於必須調用各自的超類實現。在初始化方法中,首先調用超類的指定初始化方法;在dealloc方法中,則在最後一步調用超類的dealloc實現。這樣做的原因是與初始化方法相反,子類應該在祖先類的執行個體變數被釋放之前釋放自己擁有的執行個體變數。
類Factory 方法的實現是為了向客戶提供方便,它們將分配和初始化合在一個步驟中,返回被建立的對象,並進行自動釋放處理。這些方法的形式是+ (type)className...其中className不包括任何首碼)。
小結:Cocoa基本原理指南之對象建立教程的內容介紹完了,希望通過本文的學習對你有所協助!