結(jié)論
- Objective-C為C語言添加了面向?qū)ο筇匦?,是其超集。Objective-C使用動態(tài)綁定的消息結(jié)構(gòu),也就是說,在運行時才會檢查對象類型。接受一條消息后,究竟應(yīng)執(zhí)行何種代碼,由運行期環(huán)境而非編譯器決定。
- 理解C語言的核心概念有助于寫好Objective-C程序,尤其要掌握內(nèi)存模型與指針。
Objective-C經(jīng)過對C語言的封裝,在C語言基礎(chǔ)上添加了面向?qū)ο筇匦浴bjective-C與C++, Java等面向?qū)ο笳Z言類似,不過很多方面有所差異。
Objective-C語言使用“消息結(jié)構(gòu)”而非“函數(shù)結(jié)構(gòu)”。Objective-C語言由Smalltalk演化而來,Smalltalk是消息性語言的鼻祖。消息與函數(shù)調(diào)用之間的區(qū)別看上去就像下面這樣:
// Messaging (Objective-C)
Object *obj = [Object new];
[obj performWith:parameter1 and:parameter2];
// Function calling (C++)
Object *obj = new Object;
obj->perform(parameter1, parameter2);
關(guān)鍵區(qū)別在于:使用消息結(jié)構(gòu)的語言,其運行時所應(yīng)執(zhí)行的代碼由運行環(huán)境來決定;而使用函數(shù)調(diào)用的語言,則由編譯器決定。
Objective-C的重要工作都由“運行期組件”完成。使用Objective-C的面向?qū)ο筇匦运璧娜繑?shù)據(jù)結(jié)構(gòu)及函數(shù)都在運行期組件里面。運行期組件中含有全部內(nèi)存管理方法。
Objective-C是C的“超集”(superset),所以C語言中的所有功能在編寫Objective-C代碼時依然適用。因此,必須同時掌握C與Objective-C這兩門語言的核心概念,方能寫出高效的Objective-C代碼來。其中尤為重要的是要理解C語言的內(nèi)存模型,這有助于理解Objective-C的內(nèi)存模型及其“引用計數(shù)”機(jī)制的工作原理。若要理解內(nèi)存模型,則需明白:Objective-C語言中的指針是用來指示對象的。如下面的對象創(chuàng)建方式:
NSString *string = @"This is string";
NSString *anotherString = string;
上面的兩行代碼創(chuàng)建了一個實例對象,但是有兩個變量都指向這個實例對象。這兩個變量都是NSString *型,這說明當(dāng)前“??臻g”里分配了兩塊內(nèi)存,每塊內(nèi)存的大小都能容下一個指針。這兩塊內(nèi)存里的值都一樣,就是NSString實例的內(nèi)存地址。
下圖描述了此時的內(nèi)存布局:

Objective-C語言的內(nèi)存管理
- 內(nèi)存管理的管理范圍:任何繼承了NSObject類的對象;
- 野指針:指向僵尸對象(不可用內(nèi)存)的指針;
- 常見的內(nèi)存管理錯誤: EXC_BAD_ACCESS 訪問了一塊壞的內(nèi)存(已被回收,不可用的內(nèi)存);
- Objective-C中不存在空指針錯誤,給空指針發(fā)送消息不會報錯。
Objective-C語言常見的內(nèi)存管理方式
- MRC(Manual Reference Counting)手動內(nèi)存管理
- ARC(Automatic Reference Counting)自動內(nèi)存管理
Objective-C語言內(nèi)存中的區(qū)域劃分
- 棧:棧區(qū)(stack)由系統(tǒng)自動分配和釋放,存放局部變量的值等;
- 堆:一般由程序員分配和釋放,如果不釋放,則出現(xiàn)內(nèi)存泄漏。程序退出時,系統(tǒng)會回收你的內(nèi)存。特點:無須,速度慢,容量大;
- 靜態(tài)存儲區(qū):全局變量(外部變量)和靜態(tài)變量都存放在靜態(tài)區(qū)域。當(dāng)程序結(jié)束時,系統(tǒng)回收;
- 常量區(qū):存放常量的內(nèi)存區(qū)域,程序結(jié)束時,系統(tǒng)回收。
- 代碼區(qū):存放二進(jìn)制代碼的區(qū)域。
注:本系列內(nèi)容部分參考《Effective Objective-C 2.0 編寫高質(zhì)量iOS與OS X代碼的52個有效方法》這本資料,如果需要,請自行購買。
寫在最后:當(dāng)今社會競爭中想要脫穎而出,人必須有一技之長,而且萬里挑一。 每個人都有不同的選擇,有時一個正確的選擇比奮斗本身更重要。 做你喜歡的事情,做你擅長的事情。 沒有七十二變,豈能大鬧天宮?