01_了解Objective-C語言的起源

結(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)存布局:

內(nèi)存描述.png

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)今社會競爭中想要脫穎而出,人必須有一技之長,而且萬里挑一。 每個人都有不同的選擇,有時一個正確的選擇比奮斗本身更重要。 做你喜歡的事情,做你擅長的事情。 沒有七十二變,豈能大鬧天宮?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容