Object-C簡介
1980年代由Brad Cox和Tim Love發(fā)明蒋川。OC較C語言基礎(chǔ)上做了面向?qū)ο蟮幕A(chǔ),它是蘋果Mac OS系統(tǒng)開發(fā)的首選語言尖滚,具有面向?qū)ο蟮刀诤闲院茫∣C為C的超集,無需重新開發(fā)即可使用Cocoa軟件框架)薪夕,動態(tài)機(jī)制支持等特性脚草。
作為一名開發(fā)者,開發(fā)中需具有底層思維與抽象思維(具體如下)
Object-C具有兩種開發(fā)方式:
1.Clang或GCC命令行方式原献,這種方式適合調(diào)試馏慨、研究與微觀調(diào)查。
2.Xcode項目姑隅,即通過Xcode建立項目写隶,該方法使用大型框架,追求設(shè)計質(zhì)量與代碼組織粤策。
Object-C編譯過程如下:
Object-C的類與對象
OC類型系統(tǒng)分為引用類型(類class樟澜,指針pointer和塊block),值類型(基礎(chǔ)數(shù)值,結(jié)構(gòu)與枚舉)和類型裝飾秩贰。
類為一種引用類型霹俺,它由棧上指針(指向?qū)?yīng)內(nèi)容)與存儲在堆上的內(nèi)容組成。其內(nèi)存圖如下:
結(jié)構(gòu)是一種值類型毒费,其實例直接存儲與棧上丙唧,參考內(nèi)存圖如下:
如上利用內(nèi)存圖有助于理解類與結(jié)構(gòu)。
補(bǔ)充:棧(stack)與堆(heap)
棧是存儲值類型觅玻,無ARC負(fù)擔(dān)想际,系統(tǒng)自動管理,空間大小編譯時確定(參數(shù)與局部變量)溪厘,函數(shù)執(zhí)行前自動分配胡本,函數(shù)結(jié)束后自動收回,函數(shù)之間通過拷貝值傳遞畸悬。
而堆是一種存儲引用類型對象侧甫,與棧相比,其分配由開發(fā)者創(chuàng)建對象時手動分配蹋宦,釋放由運(yùn)行時ARC機(jī)制自動釋放披粟,函數(shù)之間傳遞則是由拷貝引用即指針傳遞,具有全局性冷冗。較棧自由守屉,但可能發(fā)生內(nèi)存泄漏的問題。
數(shù)據(jù)成員:屬性與實例變量
屬性表達(dá)實例狀態(tài)蒿辙,描述類型對外接口拇泛。
默認(rèn)情況下,系統(tǒng)會為屬性定義@property自動生成setter(setPropertyName)與getter(propertyname)訪問器方法(無需聲明即可調(diào)用须板,如self.x)碰镜,還會自動生成相應(yīng)的實例變量(_propertyname)兢卵。
補(bǔ)充:類外一律使用屬性來訪問(如property.x)习瑰,類內(nèi)一般也用self使用屬性來訪問。僅有init秽荤,dealloc與自定義訪問器方法里用實例變量訪問甜奄。
屬性的描述特性:
讀寫特性:readwrite(默認(rèn),無需定義時特別寫出)與readonly(只讀)窃款。
多線程特性:原子性與非原子性课兄。
內(nèi)存管理特性:ARC環(huán)境下,強(qiáng)引用strong(默認(rèn))晨继,弱引用weak(有時可避免一些循環(huán)引用)和拷貝屬性copy創(chuàng)建獨(dú)立拷貝(避免賦值改變時對原引用對象的改變)烟阐。
函數(shù)成員:方法
函數(shù)指分為全局函數(shù)即屬于C語言函數(shù)(需在main函數(shù)運(yùn)行前前置聲明)和成員函數(shù)即屬于ObjC。
方法是類的成員函數(shù),表達(dá)實例行為或類型行為(默認(rèn)均為公有蜒茄,無私有和受限的方法)唉擂。方法調(diào)用通過運(yùn)行時動態(tài)消息分發(fā)實現(xiàn)。
方法又可分為實例方法和類型方法檀葛。
實例方法-表達(dá)實例行為玩祟,可以訪問實例成員(實例屬性、實例變量屿聋、實例方法)空扎。
實例方法一般以:-(返回值類型)方法名 ? ?這種方式聲明定義(如-(void)say)∪蠹ィ可以在實例方法中調(diào)用實例方法转锈。
類方法,表達(dá)類型行為楚殿,訪問權(quán)限:可以訪問類型方法和靜態(tài)變量黑忱,不能訪問實例成員。聲明時往往通過 ? ?+(返回值類型)名稱勒魔。不能再方法中調(diào)用實例方法甫煞。
補(bǔ)充說明:方法參數(shù)有值類型或指針類型。方法可以無參數(shù)也可無返回值(如-(void)say)冠绢。方法有參數(shù)抚吠,方法名約定包含第一個參數(shù)名,第二個參數(shù)名需要顯式提供外部參數(shù)名弟胀,例如 -(void)initWithX:(int)x withY:(init)y楷力。最后看看方法動態(tài)調(diào)用機(jī)制。
初始化器與析構(gòu)器dealloc
初始化器用于初始化對象實例或者類型孵户,即其分為對象初始化器(-(id)init)和類型初始化器(+(void)initialize)萧朝。
初始化對象實例時(調(diào)用時),init常和alloc搭配使用夏哭。例如:NSString* p1=[[NSString alloc]init]检柬。
alloc主要做:在堆上分配合適大小的內(nèi)存,將屬性和實例變量的內(nèi)存置0竖配。
init做的則是調(diào)用父類初始化器和初始化當(dāng)前實例變量何址。需要注意的是初始化中盡量使用實例變量,不要使用屬性进胯。
也可以使用new(相當(dāng)于無參型alloc/init)初始化用爪。例如[p1 new]
補(bǔ)充:類型初始化器(+(void)initialize)負(fù)責(zé)類型級別的初始化,在類使用前被系統(tǒng)自動調(diào)用胁镐,在每個進(jìn)程周期中只調(diào)用一次偎血。
dealloc主要負(fù)責(zé)釋放對象擁有的動態(tài)資源诸衔,其實現(xiàn)下面功能:
需要注意dealloc是根據(jù)ARC對象引用計數(shù)原則,釋放對象內(nèi)存前自動調(diào)用颇玷,無法手工調(diào)用署隘。
繼承與多態(tài)
繼承是類中的一個重要的特性, 他的出現(xiàn)使得我們沒必要寫重復(fù)的代碼亚隙; 可重用性高磁餐。首先指定一個父類,在子類聲明中引用父類阿弃,這樣子類便自動繼承了父類中的實例變量诊霹,實例方法,屬性和類方法渣淳。其內(nèi)存模型大致如下:
多態(tài)是子類在父類統(tǒng)一行為接口下脾还,表現(xiàn)不同的實現(xiàn)形式(子類方法進(jìn)行了重寫)。下面例子即是一個典型多態(tài)(Shape為父類入愧,Rectangle是子類)鄙漏。
Shape *rect = [[Rectangle alloc]init];
rect.no=200;
rect->_data++;
[rect draw];?
[rect print];
[Rectangle process];