iOS開發(fā)總結(jié)-淺談Block的內(nèi)存管理

前言

對于大多數(shù)iOS開發(fā)人員來說映跟,Block應該并不陌生,iOS4.0已開始支持Block拗小,在編程過程中,Block被Objective-C看成是對象樱哼,它封裝了一段代碼哀九,這段代碼可以在任何時候執(zhí)行剿配。Block可以作為函數(shù)參數(shù)或者函數(shù)的返回值,而其本身又可以帶輸入?yún)?shù)或返回值阅束。它是對C語言的擴展呼胚,用來實現(xiàn)匿名函數(shù)的特性。
Block的使用很像函數(shù)指針息裸,不過與函數(shù)最大的不同是:Block可以訪問函數(shù)以外蝇更、詞法作用域以內(nèi)的外部變量的值。
Block的特殊特性方便了開發(fā)人員的使用呼盆,但是Block的內(nèi)存需要開發(fā)人員自己管理年扩,錯誤的內(nèi)存管理會造成循環(huán)引用內(nèi)存泄露,或者內(nèi)存因為提前釋放造成崩潰访圃。
因此厨幻,Block的內(nèi)存管理是很重要的,本文將主要討論Block使用過程中的內(nèi)存管理問題腿时。


開發(fā)環(huán)境
  • Xcode 9正式版
  • ARC
  • 真機調(diào)試 iPhone 7 Plus 11.0.1
  • MacBook Pro 10.13

創(chuàng)建代碼如下:

//局部變量
- (void)localVar
{
    int localVar = 10;
    NSLog(@"localVar --%p",&localVar);
    sumBlock block1 = ^(int x,int y){
        NSLog(@"localVar --%p",&localVar);
        return localVar + x + y;
    };
    localVar = 0;
    int z = block1(1,2);
    NSLog(@"localVar -- z = %d",z);
}
1.png

打印結(jié)果:

2.png
//靜態(tài)變量
- (void)staticVar
{
    static int staticVar = 10;
    NSLog(@"staticVar --%p",&staticVar);
    sumBlock block2 = ^(int x,int y){
        NSLog(@"staticVar --%p",&staticVar);
        return staticVar + x + y;
    };
    staticVar = 0;
    int z = block2(1,2);
    NSLog(@"staticVar -- z = %d",z);
}
3.png

打印結(jié)果:

4.png
//全局變量
- (void)globalVar
{
    NSLog(@"globalVar --%p", &globalVar);
    sumBlock block3 = ^(int x, int y) {
        NSLog(@"globalVar --%p", &globalVar);
        return globalVar + x + y;
    };
    globalVar = 0;
    int z = block3(1, 2);
    NSLog(@"globalVar -- z = %d", z);
}
5.png

打印結(jié)果:


6.png
//__block
- (void)blockVar
{
    __block int blockVar = 10;
    NSLog(@"blockVar --%p", &blockVar);
    sumBlock block4 = ^(int x, int y) {
        NSLog(@"blockVar --%p", &blockVar);
        return blockVar + x + y;
    };
    blockVar = 0;
    int z = block4(1, 2);
    NSLog(@"blockVar -- z - %d", z);
}
7.png

打印結(jié)果:


8.png
總結(jié)
  1. block中的變量是靜態(tài)或者全局類型時况脆,在block中該變量的內(nèi)存地址沒有發(fā)生改變。由于靜態(tài)變量和全局變量其地址是固定的批糟,因此block在定義的時候并沒有復制該變量的值格了,而是直接從其所在內(nèi)存中讀出。
  2. block中的變量是局部類型時徽鼎,在block中它的地址都發(fā)生了變化盛末,block在定義的時候拷貝了它(開辟了新的內(nèi)存空間),它在block中是作為常量使用的纬傲,其值不受外面的影響满败。
  3. block中的變量是__block類型時,在block中它的地址都發(fā)生了變化叹括,但是blockVar的值受到外界影響算墨,這是因為blockVar在定義變量本身的時候是位于stack上的,而在定義block的時候汁雷,該變量并不是被復制了一份净嘀,而是編譯器將其轉(zhuǎn)移到了heap上,這個地方其實變量是被復制了一份的侠讯,并且作為生成的新的結(jié)構(gòu)體的一個成員變量挖藏。這個是更深層次的東西,等研究關于__block的原理的東西的時候會有相關介紹厢漩。

參考相關資料

iOS開發(fā)總結(jié)-Block(二)
Block源碼解析和深入理解
深入研究Block捕獲外部變量和__block實現(xiàn)原理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末膜眠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宵膨,老刑警劉巖架谎,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辟躏,居然都是意外死亡谷扣,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門捎琐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來会涎,“玉大人,你說我怎么就攤上這事瑞凑∧┩海” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵拨黔,是天一觀的道長蛔溃。 經(jīng)常有香客問我,道長篱蝇,這世上最難降的妖魔是什么贺待? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮零截,結(jié)果婚禮上麸塞,老公的妹妹穿的比我還像新娘。我一直安慰自己涧衙,他們只是感情好哪工,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著弧哎,像睡著了一般雁比。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上撤嫩,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天偎捎,我揣著相機與錄音,去河邊找鬼序攘。 笑死茴她,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的程奠。 我是一名探鬼主播丈牢,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瞄沙!你這毒婦竟也來了己沛?” 一聲冷哼從身側(cè)響起慌核,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎申尼,沒想到半個月后遂铡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡晶姊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了伪货。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片们衙。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖碱呼,靈堂內(nèi)的尸體忽然破棺而出蒙挑,到底是詐尸還是另有隱情,我是刑警寧澤愚臀,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布忆蚀,位于F島的核電站,受9級特大地震影響姑裂,放射性物質(zhì)發(fā)生泄漏馋袜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一舶斧、第九天 我趴在偏房一處隱蔽的房頂上張望欣鳖。 院中可真熱鬧,春花似錦茴厉、人聲如沸泽台。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怀酷。三九已至,卻和暖如春嗜闻,著一層夾襖步出監(jiān)牢的瞬間蜕依,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工泞辐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留笔横,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓咐吼,卻偏偏與公主長得像吹缔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锯茄,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

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

  • 《Objective-C高級編程》這本書就講了三個東西:自動引用計數(shù)厢塘、block茶没、GCD,偏向于從原理上對這些內(nèi)容...
    WeiHing閱讀 9,816評論 10 69
  • 前言 Blocks是C語言的擴充功能晚碾,而Apple 在OS X Snow Leopard 和 iOS 4中引入了這...
    小人不才閱讀 3,769評論 0 23
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,182評論 25 707
  • 下午 草泥馬你麻痹還是不明白匝數(shù)比和反饋系數(shù)草泥馬啊 高頻實驗狗電路圖日你哥mutlisim仿真不出結(jié)果我勒個槽 ...
    陸海光和閱讀 226評論 0 0
  • 《四書章句集注》:慍,紆問反糕簿。慍探入,含怒意。君子懂诗,成德之名蜂嗽。尹氏曰:“學在己,知不知在人殃恒,何慍之有植旧。”程子曰:“雖樂...
    bodhi1984閱讀 2,212評論 0 0