為什么Objective-C對(duì)象存儲(chǔ)在堆上而不是棧上

一、什么是棧對(duì)象和堆對(duì)象

在Objective-C中,對(duì)象通常是指一塊有特定布局的連續(xù)內(nèi)存區(qū)域。我們通常這樣創(chuàng)建一個(gè)對(duì)象

NSObject *obj = [[NSObject alloc] init];

這行代碼創(chuàng)建了一個(gè)NSObject類型的指針obj和一個(gè)NSObject類型的對(duì)象,obj指針存儲(chǔ)在棧上,而其指向的對(duì)象則存儲(chǔ)在堆上(堆對(duì)象)

目前OC并不支持直接在棧上創(chuàng)建對(duì)象(棧對(duì)象),但可以通過(guò)如下方式間接的創(chuàng)建

struct {
Class isa;
} fakeNSObject;
fakeNSObject.isa = [NSObject class];

NSObject *obj = (NSObject *)&fakeNSObject;
NSLog(@"%@", [obj description]);

二、棧對(duì)象優(yōu)缺點(diǎn)

1、優(yōu)點(diǎn)

  • 速度
    在棧上創(chuàng)建對(duì)象是非??斓?,因?yàn)楹芏鄸|西在編譯時(shí)就確定了,運(yùn)行時(shí)分配空間幾乎不耗時(shí);相對(duì)而言在堆上創(chuàng)建對(duì)象就非常耗時(shí)。
  • 簡(jiǎn)單
    站對(duì)象的生命周期是確定的,對(duì)象出棧以后就會(huì)被釋放,不會(huì)存在內(nèi)存泄漏,但這同樣也是棧對(duì)象的最大缺點(diǎn)。

2、缺點(diǎn)

  • 生命周期固定
    OC變量有效范圍是由“{}”包含的塊來(lái)決定的,也就是說(shuō)找對(duì)象的生命周期僅限于其所在的塊里,出了塊立馬會(huì)被釋放,一個(gè)對(duì)象被創(chuàng)建以后有可能會(huì)通過(guò)方法調(diào)用傳遞到別的方法,當(dāng)找對(duì)象的創(chuàng)建方法返回時(shí),棧對(duì)象會(huì)被一起pop出棧而釋放,導(dǎo)致其沒(méi)法在別處被繼續(xù)持有。此時(shí)retain操作會(huì)失效,除非用copy方法在想持有該棧對(duì)象的地方重新拷貝一份屬于自己的站對(duì)象。
    因此,棧對(duì)象會(huì)給對(duì)象的內(nèi)存管理造成巨大的麻煩。
  • 空間
    現(xiàn)在操作系統(tǒng)的棧和線程綁定,而??臻g是有限的,具體如下:
512 KB (secondary threads)
8 MB (OS X main thread)
1 MB (iOS main thread)

因此對(duì)象如果都在棧上創(chuàng)建不太現(xiàn)實(shí),而堆只要物理內(nèi)存不警告可以無(wú)限使用。
綜合以上優(yōu)缺點(diǎn),OC選擇用堆存儲(chǔ)對(duì)象。

三、真的沒(méi)有對(duì)象嗎

實(shí)際上OC里的block卻是棧對(duì)象,因此棧對(duì)象面臨的問(wèn)題在block身上一個(gè)都不少,但由于block是僅有的特殊對(duì)象,大家對(duì)他的特殊性都已經(jīng)習(xí)慣了。
另外,根據(jù)前面所說(shuō),棧對(duì)象的有效區(qū)域僅限于其所在的塊,因此像下面的代碼就無(wú)法輸出期望的結(jié)果:

void (^block)();
if(x)
{
block = ^{ printf("x\n"); };
}
else
{
block = ^{ printf("not x\n"); };
}
block();

原文鏈接:http://foggry.com/blog/2017/02/06/wei-shi-yao-objective-c-dui-xiang-cun-chu-zai-dui-shang-er-bu-shi-zhan-shang/

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

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

  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,604評(píng)論 30 472
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,789評(píng)論 11 349
  • 禪與 Objective-C 編程藝術(shù) (Zen and the Art of the Objective-C C...
    GrayLand閱讀 1,770評(píng)論 1 10
  • 凌晨一點(diǎn)微信通知閃出來(lái),在王者峽谷團(tuán)戰(zhàn)的我殺紅了眼,關(guān)鍵時(shí)刻擋住視野,屏幕一暗:You have been sla...
    瓷蘇閱讀 311評(píng)論 0 0
  • 刺 文/陸纖橙 提筆的原因大概是因?yàn)槲蚁霊涯钗疑谐霈F(xiàn)過(guò)的妳。 三島由紀(jì)夫說(shuō)過(guò):也許是天生懦弱的關(guān)系,我對(duì)所有的...
    komolebi_kay閱讀 534評(píng)論 0 0

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