第一條 了解Objective-C語言的起源

這是本系列筆記的第一篇文章,這個(gè)系列是閱讀《Effective Objective-C2.0編寫高質(zhì)量iOS和OS X代碼的52個(gè)有效方法》的讀書筆記

第一條是了解Objective-C的語言起源和特點(diǎn)以及簡(jiǎn)單地介紹了一下對(duì)象內(nèi)存分配的問題

  • Objective-C的動(dòng)態(tài)綁定
    以函數(shù)調(diào)用方式和消息傳遞方式做了比較,簡(jiǎn)單地說消息傳遞的方式,就是推遲了函數(shù)或者是對(duì)象的確定時(shí)間,采用函數(shù)調(diào)用的方式,對(duì)象的確定是由編譯器去決定的,多態(tài)還是到底要執(zhí)行哪個(gè)函數(shù)實(shí)在運(yùn)行的時(shí)候由“虛方法表”(virtual method table)去確定的;采用消息傳遞的方式,無論是不是多態(tài)的函數(shù),函數(shù)的確定都是在運(yùn)行時(shí)確定的,接受消息的對(duì)象類型也是在運(yùn)行時(shí)才確定的,程序編譯的時(shí)候不會(huì)去管這些

  • 對(duì)象內(nèi)存分配
    先看下面的這張圖

對(duì)象創(chuàng)建內(nèi)存分配.png

其實(shí)學(xué)過Java的話也是很容易理解的,只是這邊的someString和anotherString都是NSString*,指針類型具體的大小根據(jù)計(jì)算機(jī)的架構(gòu)來決定,

NSString *someString = @"The String";
NSString *anotherString = someString;

對(duì)象被分配在堆中,而指針類型的變量都被分配到棧上,當(dāng)anotherString指向了someString所指向的對(duì)象的時(shí)候,不會(huì)創(chuàng)建新的對(duì)象,只是對(duì)象的引用計(jì)數(shù)加一;在C++中創(chuàng)建在堆上的對(duì)象需要程序員手動(dòng)釋放內(nèi)存,但是OC引入了ARC的概念,那些引用計(jì)數(shù)為0(沒有強(qiáng)類型指針指向的)對(duì)象會(huì)自動(dòng)釋放內(nèi)存空間

當(dāng)然也有一些變量例如CGRect,他們被分配到棧上,有一個(gè)顯著的特征就是他們不是對(duì)象,不帶*

CGRect結(jié)構(gòu)體.png

其實(shí)可以發(fā)現(xiàn)CGRect是一個(gè)結(jié)構(gòu)體,而內(nèi)部的CGPoint和CGSize也是結(jié)構(gòu)體,使用結(jié)構(gòu)體而不使用對(duì)象可以免去一些內(nèi)存的開銷,通常使用結(jié)構(gòu)體是因?yàn)檫@個(gè)“對(duì)象”里面只包含了一些簡(jiǎn)單的數(shù)據(jù)類型

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容