Objective-C中Block內(nèi)存分配全解析

Block的類

設(shè)置對(duì)象的儲(chǔ)存域
_NSConcreteStackBlock 棧區(qū)
_NSConcreteGlobalBlock 程序的數(shù)據(jù)區(qū)(全局區(qū))
_NSConcreteMallocBlock 堆區(qū)


Block分配的規(guī)律

Block不論在ARC下還是在MRC下贡羔,都會(huì)視情況被分配到這三種區(qū)中枢步。我總結(jié)了分配在各種區(qū)的條件债蓝,如下:

  • NSConcreteGlobalBlock:無(wú)論此block是否被持有祝峻,block內(nèi)沒(méi)有引用外部變量
  • NSConcreteStackBlock: 此block必須未被持有枯夜,并且引用了外部變量
  • NSConcreteMallocBlock:此block必須被持有挺智,并且引用了外部變量

Block執(zhí)行過(guò)copy后的情況

Block的類 副本源的配置儲(chǔ)存域 復(fù)制效果
_NSConcreteStackBlock 棧區(qū) 從棧復(fù)制到堆
_NSConcreteGlobalBlock 全局區(qū) 什么也不做
_NSConcreteMallocBlock 堆區(qū) 引用計(jì)數(shù)增加


棧上的Block什么時(shí)候會(huì)被復(fù)制到堆

  • 調(diào)用Block的copy實(shí)例方法
  • Block作為函數(shù)返回值返回時(shí)
  • 將Block賦值給附有__strong修飾符id類型的類或Block類型成員變量時(shí)
  • 在方法名中含有usingBlockCocoa框架方法或Grand Central Dispatch的API中傳遞Block時(shí)

接下來(lái)就結(jié)合代碼來(lái)分析Block的內(nèi)存分配祷愉。

等號(hào)左側(cè)在OC默認(rèn)情況下屬于強(qiáng)指針,用__weak修飾后變成弱指針赦颇,右側(cè)Block不會(huì)被持有二鳄,并且Block引用了外部變量,所以會(huì)被分配在棧區(qū)

int temp = 10;
__weak void(^blk_t1)(void) = ^{
    NSLog(@"%d",temp);
};
NSLog(@"1===%@",blk_t1);

image.png


等號(hào)左側(cè)在OC默認(rèn)情況下屬于強(qiáng)指針媒怯,右側(cè)block被持有订讼,引用外部變量就分配在堆區(qū)

int temp = 10;
void(^blk_t)(void) = ^{
    NSLog(@"%d",temp);
};
blk_t();
NSLog(@"2===%@",blk_t);

image.png


等號(hào)左側(cè)在OC默認(rèn)情況下屬于強(qiáng)指針,右側(cè)block被持有扇苞,不引用外部變量就分配在全局區(qū)

void(^blk_tt)(void) = ^{
        
};
NSLog(@"3===%@",blk_tt);

image.png


此block未被持有欺殿,且引用了外部變量寄纵,所以分配在棧區(qū)

int temp = 10;
NSLog(@"4===%@",^{
    NSLog(@"%d",temp);
});

image.png


棧區(qū)的block在執(zhí)行copy后會(huì)被分配到堆區(qū)

int temp = 10;
NSLog(@"5===%@",[^{
    NSLog(@"%d",temp);
} copy]);

image.png


等號(hào)左側(cè)在OC默認(rèn)情況下屬于強(qiáng)指針,右側(cè)block被持有脖苏,block內(nèi)部未引用外部變量擂啥,被分配到全局區(qū),執(zhí)行copy后依然在全局區(qū)

void (^blk_ttt)(void) = ^() {
    
};
blk_ttt();

NSLog(@"\n6===\n拷貝前%@\n拷貝后%@",blk_ttt,[blk_ttt copy]);

image.png


block使用內(nèi)部局部變量帆阳,未引用外部變量哺壶,依然是全局block

void (^blk_tttt)(void) = ^{
    int b = 20;
    NSLog(@"%d",b);
};
blk_tttt();
NSLog(@"7===%@",blk_tttt);

image.png


block內(nèi)部使用傳進(jìn)來(lái)的參數(shù),并不會(huì)持有該參數(shù)蜒谤,此block在使用了參數(shù)后依然是全局block

NSString *str = @"I love China!";
void (^blk_ttttt)(NSString *) = ^(NSString *param){
    NSLog(@"%@",param);
};
blk_ttttt(str);
NSLog(@"8===%@",blk_ttttt);
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末山宾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鳍徽,更是在濱河造成了極大的恐慌资锰,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阶祭,死亡現(xiàn)場(chǎng)離奇詭異绷杜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)濒募,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)鞭盟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人瑰剃,你說(shuō)我怎么就攤上這事齿诉。” “怎么了晌姚?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵粤剧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我挥唠,道長(zhǎng)抵恋,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任宝磨,我火速辦了婚禮弧关,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘懊烤。我一直安慰自己梯醒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布腌紧。 她就那樣靜靜地躺著茸习,像睡著了一般。 火紅的嫁衣襯著肌膚如雪壁肋。 梳的紋絲不亂的頭發(fā)上号胚,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天籽慢,我揣著相機(jī)與錄音,去河邊找鬼猫胁。 笑死箱亿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弃秆。 我是一名探鬼主播届惋,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼菠赚!你這毒婦竟也來(lái)了脑豹?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤衡查,失蹤者是張志新(化名)和其女友劉穎瘩欺,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拌牲,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俱饿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了塌忽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拍埠。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖砚婆,靈堂內(nèi)的尸體忽然破棺而出械拍,到底是詐尸還是另有隱情,我是刑警寧澤装盯,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站甲馋,受9級(jí)特大地震影響埂奈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜定躏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一账磺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧痊远,春花似錦垮抗、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至逞姿,卻和暖如春辞嗡,著一層夾襖步出監(jiān)牢的瞬間捆等,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工续室, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留栋烤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓挺狰,卻偏偏與公主長(zhǎng)得像明郭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丰泊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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