cocoa物件的建立總是分成兩個階段:物件分配和初始化。
cocoa會從應用程式的虛存區中為物件分配足夠的記憶體。在計算需要分配多少記憶體時,cocoa會考慮物件的例項變數,包括它們的型別和順序,這些資訊由物件的類來定義。為了進行物件分配,您需要向物件的類傳送alloc或allocwithzone:訊息。在訊息的返回值中可以得到乙個「生的」(未初始化的)類例項。alloc方法使用應用程式預設的虛存區。區是乙個按頁對齊的記憶體區域,用於存放應用程式分配的物件和資料。
除了分配記憶體之外,cocoa的分配(allocation)訊息還進行其它一些重要的工作:
§ 將物件的保持數設定為1。
§ 使初始化物件的isa
例項變數指向物件的類。物件類是乙個根據類定義編譯得到的執行時物件。
§ 將其它所有的例項變數初始化為0(或者與0等價的型別,比如nil
、null
、和0.0
)。
物件的isa例項變數是從nsobject繼承下來的,因此所有的cocoa物件都有。在將isa指標指向物件類之後,物件就被整合到繼承層次的執行時檢視和構成程式的物件(類和例項)網路中了。其結果是物件可以找到它所需要的所有執行時資訊,比如其它物件在繼承層次上的位置,它們遵循的協議,以及在響應訊息時可以執行的方法實現的位置。
初始化過程將物件的例項變數設定為合理而有用的初始值,還可以分配和準備物件需要的其它全域性資源,並在必要時裝載諸如檔案這樣的資源。宣告例項變數的所有物件都應該實現乙個初始化方法-除非將所有變數都置為0的預設初始化已經足夠。如果乙個物件沒有實現自己的初始化方法,cocoa就會呼叫其最近的祖先物件的方法。
nsobject宣告了init方法作為初始化方法的原型,它是乙個例項方法,返回乙個型別為id的物件。對於不需要初始化其它資料的子類,過載init方法就可以了,但是常見的情況是初始化階段需要根據外部的資料來設定物件的初始狀態。唯一的要求是初始化方法必須以「init」字母開頭(有時用格式規則描述init...來表示初始化方法)。從初始化方法返回nil表示不能建立被請求的物件。在建立物件時,通常應該在處理之前檢查返回值是否為nil。一旦物件被初始化了,就不應該再進行初始化。如果您試圖進行重複初始化,例項化物件的框架類通常會產生乙個例外。
實現乙個init...
部分的描述),有如下幾個關鍵步驟:
§ 總是首先呼叫超類(super
)的初始化方法。
§ 檢查超類返回的物件。如果是nil
,則初始化不能進行,需要向接收者物件返回nil
。
§ 在初始化例項變數時,如果它們是其它物件的引用,則在必要時進行保留和拷貝。
§ 將例項變數設定為正當的初始值之後,就返回self
,除了下列的情況:
§ 需要返回乙個代替物件,在這種情況下,首先釋放新分配的物件。
§ 某些問題導致不能成功初始化,這時需要返回nil
。
在很多方面,乙個類的dealloc方法都是和init...
方法(特別是指定初始化方法)相呼應的。初始化方法在物件分配之後馬上被呼叫,而dealloc在物件的銷毀之前被呼叫;初始化方法確保物件的例項變數被正確初始化,而dealloc方法確保該物件的例項變數被釋放,以及確保動態分配的記憶體被釋放。
兩者的最後一點相似之處在於必須呼叫各自的超類實現。在初始化方法中,首先呼叫超類的指定初始化方法;在dealloc方法中,則在最後一步呼叫超類的dealloc實現。這樣做的原因是與初始化方法相反,子類應該在祖先類的例項變數被釋放之前釋放自己擁有的例項變數。
類工廠方法的實現是為了向客戶提供方便,它們將分配和初始化合在乙個步驟中,返回被建立的物件,並進行自動釋放處理。這些方法的形式是+ (type)classname...(其中classname不包括任何字首)。
Cocoa基本原理指南之五 物件的建立
cocoa物件的建立總是分成兩個階段 物件分配和初始化。cocoa會從應用程式的虛存區中為物件分配足夠的記憶體。在計算需要分配多少記憶體時,cocoa會考慮物件的例項變數,包括它們的型別和順序,這些資訊由物件的類來定義。為了進行物件分配,您需要向物件的類傳送alloc或allocwithzone 訊...
Cocoa基本原理指南之六 內省
內省是物件揭示自己作為乙個執行時物件的詳細資訊的一種能力。這些詳細資訊包括物件在繼承樹上的位置,物件是否遵循特定的協議,以及是否可以響應特定的訊息。nsobject協議和類定義了很多內省方法,用於查詢執行時資訊,以便根據物件的特徵進行識別。明智地使用內省可以使物件導向的程式更加高效和強壯。它有助於避...
Cocoa基本原理指南之七 類簇
類簇類簇是foundation框架中廣泛使用的設計模式。類簇將一些私有的 具體的子類組合在乙個公共的 抽象的超類下面,以這種方法來組織類可以簡化乙個物件導向框架的公開架構,而又不減少功能的豐富性。類簇基於抽象工廠設計模式。類簇架構代表乙個反映簡單概念的設計。類簇中的抽象超類必須宣告建立其私有子類的方...