Cocoa基本原理指南之對象創(chuàng)建教程
Cocoa基本原理指南中對象創(chuàng)建的內(nèi)容是本文要介紹的內(nèi)容,Cocoa對象的創(chuàng)建總是分成兩個階段:對象分配和初始化。Cocoa會從應(yīng)用程序的虛存區(qū)中為對象分配足夠的內(nèi)存。在計算需要分配多少內(nèi)存時,Cocoa會考慮對象的實例變量,包括它們的類型和順序,這些信息由對象的類來定義。為了進行對象分配,您需要向對象的類發(fā)送alloc或allocWithZone:消息。
在消息的返回值中可以得到一個“生的”(未初始化的)類實例。alloc方法使用應(yīng)用程序缺省的虛存區(qū)。區(qū)是一個按頁對齊的內(nèi)存區(qū)域,用于存放應(yīng)用程序分配的對象和數(shù)據(jù)。
除了分配內(nèi)存之外,Cocoa的分配(allocation)消息還進行其它一些重要的工作:
- <!--[if !supportLists]-->§ <!--[endif]-->將對象的保持數(shù)設(shè)置為1。
- <!--[if !supportLists]-->§ <!--[endif]-->使初始化對象的isa實例變量指向?qū)ο蟮念悺ο箢愂且粋€根據(jù)類定義編譯得到的運行時對象。
- <!--[if !supportLists]-->§ <!--[endif]-->將其它所有的實例變量初始化為0(或者與0等價的類型,比如nil、NULL、和0.0)。
對象的isa實例變量是從NSObject繼承下來的,因此所有的Cocoa對象都有。在將isa指針指向?qū)ο箢愔?,對象就被集成到繼承層次的運行時視圖和構(gòu)成程序的對象(類和實例)網(wǎng)絡(luò)中了。其結(jié)果是對象可以找到它所需要的所有運行時信息,比如其它對象在繼承層次上的位置,它們遵循的協(xié)議,以及在響應(yīng)消息時可以執(zhí)行的方法實現(xiàn)的位置。
初始化過程將對象的實例變量設(shè)置為合理而有用的初始值,還可以分配和準備對象需要的其它全局資源,并在必要時裝載諸如文件這樣的資源。聲明實例變量的所有對象都應(yīng)該實現(xiàn)一個初始化方法-除非將所有變量都置為0的缺省初始化已經(jīng)足夠。如果一個對象沒有實現(xiàn)自己的初始化方法,Cocoa就會調(diào)用其最近的祖先對象的方法。
NSObject聲明了init方法作為初始化方法的原型,它是一個實例方法,返回一個類型為id的對象。對于不需要初始化其它數(shù)據(jù)的子類,重載init方法就可以了,但是常見的情況是初始化階段需要根據(jù)外部的數(shù)據(jù)來設(shè)置對象的初始狀態(tài)。唯一的要求是初始化方法必須以“init”字母開頭(有時用格式規(guī)則描述init...來表示初始化方法)。從初始化方法返回nil表示不能創(chuàng)建被請求的對象。在創(chuàng)建對象時,通常應(yīng)該在處理之前檢查返回值是否為nil。一旦對象被初始化了,就不應(yīng)該再進行初始化。如果您試圖進行重復初始化,實例化對象的框架類通常會產(chǎn)生一個例外。
實現(xiàn)一個init... 方法,使之作為類的唯一初始化方法或者具有多個初始化方法的類的指定初始化方法時(參見"多個初始化方法和指定初始化方法"部分的描述),有如下幾個關(guān)鍵步驟:
- <!--[if !supportLists]-->§ <!--[endif]-->總是首先調(diào)用超類(super)的初始化方法。
- <!--[if !supportLists]-->§ <!--[endif]-->檢查超類返回的對象。如果是nil,則初始化不能進行,需要向接收者對象返回nil。
- <!--[if !supportLists]-->§ <!--[endif]-->在初始化實例變量時,如果它們是其它對象的引用,則在必要時進行保留和拷貝。
- <!--[if !supportLists]-->§ <!--[endif]-->將實例變量設(shè)置為正當?shù)某跏贾抵?,就返回self,除了下列的情況:
- <!--[if !supportLists]-->§ <!--[endif]-->需要返回一個代替對象,在這種情況下,首先釋放新分配的對象。
- <!--[if !supportLists]-->§ <!--[endif]-->某些問題導致不能成功初始化,這時需要返回nil。
在很多方面,一個類的dealloc方法都是和init... 方法(特別是指定初始化方法)相呼應(yīng)的。初始化方法在對象分配之后馬上被調(diào)用,而dealloc在對象的銷毀之前被調(diào)用;初始化方法確保對象的實例變量被正確初始化,而dealloc方法確保該對象的實例變量被釋放,以及確保動態(tài)分配的內(nèi)存被釋放。
兩者的***一點相似之處在于必須調(diào)用各自的超類實現(xiàn)。在初始化方法中,首先調(diào)用超類的指定初始化方法;在dealloc方法中,則在***一步調(diào)用超類的dealloc實現(xiàn)。這樣做的原因是與初始化方法相反,子類應(yīng)該在祖先類的實例變量被釋放之前釋放自己擁有的實例變量。
類工廠方法的實現(xiàn)是為了向客戶提供方便,它們將分配和初始化合在一個步驟中,返回被創(chuàng)建的對象,并進行自動釋放處理。這些方法的形式是+ (type)className...(其中className不包括任何前綴)。
小結(jié):Cocoa基本原理指南之對象創(chuàng)建教程的內(nèi)容介紹完了,希望通過本文的學習對你有所幫助!