block介紹內(nèi)存管理修飾

block塊存儲(chǔ)位置

block塊根據(jù)情況有兩種可能的存儲(chǔ)位置衡招,一種存在代碼區(qū),一種存在堆區(qū)每强。

1蚁吝、如果block塊沒有訪問處于棧區(qū)的變量(比如局部變量)旱爆,也沒有訪問堆區(qū)的變量(比如我們alloc創(chuàng)建的對(duì)象),那就存在代碼區(qū)窘茁,即使訪問了全局變量怀伦,也依然存在代碼區(qū)。

2山林、如果訪問了棧區(qū)或者堆區(qū)的變量房待,那就會(huì)被存在堆區(qū)(實(shí)際存在棧區(qū),ARC下會(huì)自動(dòng)拷貝到堆區(qū))驼抹。

關(guān)于存在堆區(qū)的情況桑孩,有一點(diǎn)需要注意的是,堆區(qū)是不斷變化的框冀,不斷地有變量的創(chuàng)建和銷毀流椒,如果block塊沒有強(qiáng)引用,那也隨時(shí)可能被銷毀明也,這就導(dǎo)致一旦在銷毀時(shí)訪問block塊宣虾,程序就會(huì)崩潰,所以温数,在定義block時(shí)绣硝,內(nèi)存修飾最好用strong或者copy。而且在使用時(shí)也最好先判斷一下block是否為空撑刺,比如:

if(!block){

return;

}block();

1

2

3

4

循環(huán)引用

既然在修飾block時(shí)鹉胖,使用了strong,那么另一個(gè)問題就需要注意了够傍,也就是循環(huán)引用甫菠。

當(dāng)使用了strong修飾后,self會(huì)強(qiáng)引用block冕屯,而如果在block中又需要訪問self的一些屬性或者方法淑蔚,從而調(diào)用了self,這時(shí)self和block就進(jìn)入循環(huán)引用愕撰,容易內(nèi)存溢出。

解決的辦法時(shí)在block中的需要用到self時(shí)醋寝,事先將self用__weak修飾搞挣,這樣互相引用的一方就不再是強(qiáng)引用了。

比如:

__weak ViewController *weakSelf =self;self.block = ^{? ? weakSelf.str= @"123";};

1

2

3

4

但是這樣還不夠音羞,在多線程下囱桨,單單使用weakSelf,可能前一刻weakSelf還在嗅绰,后面需要用時(shí)卻被釋放掉了舍肠,畢竟弱引用是不穩(wěn)定的搀继,這時(shí)候就需要又使用一個(gè)修飾符__strong來在block中修飾,是不是操碎了心翠语。

因此更好的釋放方式如下:

__weak__typeof(self) *weakSelf =self;self.block= ^{? ? __strong__typeof(self) strongSelf = weakSelf;if(strongSelf) {? ? ? ? strongSelf.str= @"123";? ? }// 如果不用了叽躯,應(yīng)置為空strongSelf.block=nil;};

1

2

3

4

5

6

7

8

9

結(jié)

平常使用block的情況很多,很多人往往都是直接拿樣例代碼改著用了肌括,不知道為什么要這么修飾block点骑,也不知道weakSelf、strongSelf有什么用谍夭。這里就從存儲(chǔ)位置來解釋為什么要這樣修飾block黑滴,從而又會(huì)造成循環(huán)引用的問題,最后如何去解決他紧索。希望可以幫助大家更好的理解手中的每一行代碼袁辈。

block塊根據(jù)情況有兩種可能的存儲(chǔ)位置,一種存在代碼區(qū)珠漂,一種存在堆區(qū)晚缩。

1、如果block塊沒有訪問處于棧區(qū)的變量(比如局部變量)甘磨,也沒有訪問堆區(qū)的變量(比如我們alloc創(chuàng)建的對(duì)象)橡羞,那就存在代碼區(qū),即使訪問了全局變量济舆,也依然存在代碼區(qū)卿泽。

2、如果訪問了棧區(qū)或者堆區(qū)的變量滋觉,那就會(huì)被存在堆區(qū)(實(shí)際存在棧區(qū)签夭,ARC下會(huì)自動(dòng)拷貝到堆區(qū))。

關(guān)于存在堆區(qū)的情況椎侠,有一點(diǎn)需要注意的是第租,堆區(qū)是不斷變化的,不斷地有變量的創(chuàng)建和銷毀我纪,如果block塊沒有強(qiáng)引用慎宾,那也隨時(shí)可能被銷毀,這就導(dǎo)致一旦在銷毀時(shí)訪問block塊浅悉,程序就會(huì)崩潰趟据,所以,在定義block時(shí)术健,內(nèi)存修飾最好用strong或者copy汹碱。而且在使用時(shí)也最好先判斷一下block是否為空,比如:

if(!block){

return;

}block();

1

2

3

4

循環(huán)引用

既然在修飾block時(shí)荞估,使用了strong咳促,那么另一個(gè)問題就需要注意了稚新,也就是循環(huán)引用。

當(dāng)使用了strong修飾后跪腹,self會(huì)強(qiáng)引用block褂删,而如果在block中又需要訪問self的一些屬性或者方法,從而調(diào)用了self尺迂,這時(shí)self和block就進(jìn)入循環(huán)引用笤妙,容易內(nèi)存溢出。

解決的辦法時(shí)在block中的需要用到self時(shí)噪裕,事先將self用__weak修飾蹲盘,這樣互相引用的一方就不再是強(qiáng)引用了。

比如:

__weak ViewController *weakSelf =self;self.block = ^{? ? weakSelf.str= @"123";};

1

2

3

4

但是這樣還不夠膳音,在多線程下召衔,單單使用weakSelf,可能前一刻weakSelf還在祭陷,后面需要用時(shí)卻被釋放掉了苍凛,畢竟弱引用是不穩(wěn)定的,這時(shí)候就需要又使用一個(gè)修飾符__strong來在block中修飾兵志,是不是操碎了心醇蝴。

因此更好的釋放方式如下:

__weak__typeof(self) *weakSelf =self;self.block= ^{? ? __strong__typeof(self) strongSelf = weakSelf;if(strongSelf) {? ? ? ? strongSelf.str= @"123";? ? }// 如果不用了,應(yīng)置為空strongSelf.block=nil;};

1

2

3

4

5

6

7

8

9

結(jié)

平常使用block的情況很多想罕,很多人往往都是直接拿樣例代碼改著用了悠栓,不知道為什么要這么修飾block,也不知道weakSelf按价、strongSelf有什么用惭适。這里就從存儲(chǔ)位置來解釋為什么要這樣修飾block,從而又會(huì)造成循環(huán)引用的問題楼镐,最后如何去解決他癞志。希望可以幫助大家更好的理解手中的每一行代碼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末框产,一起剝皮案震驚了整個(gè)濱河市凄杯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌秉宿,老刑警劉巖戒突,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蘸鲸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)窿锉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門酌摇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膝舅,“玉大人,你說我怎么就攤上這事窑多∪韵。” “怎么了?”我有些...
    開封第一講書人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵埂息,是天一觀的道長(zhǎng)技潘。 經(jīng)常有香客問我,道長(zhǎng)千康,這世上最難降的妖魔是什么享幽? 我笑而不...
    開封第一講書人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮拾弃,結(jié)果婚禮上值桩,老公的妹妹穿的比我還像新娘。我一直安慰自己豪椿,他們只是感情好奔坟,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搭盾,像睡著了一般咳秉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸯隅,一...
    開封第一講書人閱讀 52,807評(píng)論 1 314
  • 那天澜建,我揣著相機(jī)與錄音,去河邊找鬼滋迈。 笑死霎奢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的饼灿。 我是一名探鬼主播幕侠,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼碍彭!你這毒婦竟也來了晤硕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤庇忌,失蹤者是張志新(化名)和其女友劉穎舞箍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體皆疹,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疏橄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捎迫。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晃酒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出窄绒,到底是詐尸還是另有隱情贝次,我是刑警寧澤,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布彰导,位于F島的核電站蛔翅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏位谋。R本人自食惡果不足惜山析,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望倔幼。 院中可真熱鬧盖腿,春花似錦、人聲如沸损同。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)膏燃。三九已至茂卦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間组哩,已是汗流浹背等龙。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伶贰,地道東北人蛛砰。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像黍衙,于是被迫代替她去往敵國(guó)和親泥畅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

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