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



















