block 嵌套中的循環(huán)引用問題

引言

相信大家對block的使用都不會感到陌生, __weak__strong也成為了大家解決循環(huán)引用的利器. 不過大家有否想過, block出現(xiàn)嵌套情況時, __weak__strong還能好使嗎, 或者說會不會有一些需要注意的地方呢?

正篇

首先我們定義了一個Person類, .h中只有1個無參無返回的block屬性 -> personBlock, 并且重寫了dealloc方法, 如下圖所示:

1.png

2.png

接下來我們在主方法中創(chuàng)建一個Person對象, 由于沒有把對象強(qiáng)引用起來, 所以對象一創(chuàng)建出來就被釋放了:

3.png

接著我們對對象進(jìn)行會造成循環(huán)引用的操作. 由于對象強(qiáng)引用著block, block也強(qiáng)引用著對象, 所以控制臺并沒有出現(xiàn)任何的打印, 編譯器也發(fā)出了相應(yīng)的警告:

4.png

為了解決循環(huán)引用問題, 我們請出了2大神器__weak__strong, 問題當(dāng)然被迎刃而解, 這里的警告只是因?yàn)榻Y(jié)果沒被使用. 當(dāng)然了, 此處其實(shí)并不需要用到__strong, 但實(shí)際開發(fā)中情況復(fù)雜多變, 基于普遍適用性的需求, 此處也用上__strong:

5.png

接下來主角出場了, 如果block中再次對block賦值的情況下會怎么樣呢? 也就是block嵌套. 我們可能會這樣想, strongPerson已經(jīng)是可以放心使用的對象了, 還需要擔(dān)心什么循環(huán)引用, 直接套進(jìn)去用就行了. 真是這樣的嗎?

6.png

果然不出所料? 先別開心太早, 雖然控制臺有輸出, 對象得到了釋放, 可是你有看到編譯器已經(jīng)發(fā)出警告了嗎? 可能你覺得編譯器出毛病了, 亂警告, 其實(shí)不然, 這里是一個語法問題, 第二層block并沒有真正被加載進(jìn)內(nèi)存. 什么? 不相信? 我只要加一句代碼問題就會馬上暴露:

7.png

只要在最后把外層的block執(zhí)行一次, 內(nèi)層的block才會真正地被加載進(jìn)內(nèi)存, 循環(huán)引用問題再次出現(xiàn). 出現(xiàn)循環(huán)引用的原因其實(shí)也不難理解, 因?yàn)?code>strongPerson說白了也是一個強(qiáng)引用, 它與一般強(qiáng)引用的區(qū)別在于, 它只會在被定義的block中對對象進(jìn)行強(qiáng)引用, 在block過后就會把對象釋放掉, 所以在第2層block中繼續(xù)用strongPerson出現(xiàn)循環(huán)引用跟一般造成循環(huán)引用的原因其實(shí)是一樣的, 解決方法也是如出一轍, 而且可以繼續(xù)嵌套下去, 此處的警告同樣是結(jié)果沒被使用:

8.png

補(bǔ)充

另外想補(bǔ)充一個關(guān)于block強(qiáng)引用對象的問題, 之前在網(wǎng)上看到過一些說法, 大概就是block會對內(nèi)部所有的對象產(chǎn)生一個強(qiáng)引用, 比如說:

    self.block = ^{
        self.name = @"Veeco";
    };

這里block首先對self產(chǎn)生一個強(qiáng)引用, 其實(shí)還對name這個屬性產(chǎn)生了一個強(qiáng)引用, 在這個補(bǔ)充里, 我就是想要澄清關(guān)于這個name屬性被強(qiáng)引用的問題.

首先我們在剛才代碼的基礎(chǔ)上加一個Dog類, 只重寫其中的dealloc方法:

9.png

接著在Person.h中增加一個Dog屬性 -> dog, 需要注意的是此處用的是weak關(guān)鍵字:

10.png

正篇開始, 我們在主方法中分別創(chuàng)建persondog對象, 并把dog對象賦值給person對象的dog屬性, 接著在person對象的block屬性中訪問person對象的dog屬性, 按照網(wǎng)上的說法, 如果block強(qiáng)引用著person對象的dog屬性的話, 我們是看不到Dog dealloc打印的, 接下來就來見證奇跡的時刻:

11.png

結(jié)果出來了, Person類沒被釋放這是肯定的, 因?yàn)樵斐闪搜h(huán)引用, 不過我們看到了Dog dealloc打印, 也就是說block并沒有強(qiáng)引用著person對象中的dog屬性, 它只強(qiáng)引用著person對象.

以上就是個人對block的一些理解, 很可能有理解不到位的地方, 還請各位看官多多指正!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末髓介,一起剝皮案震驚了整個濱河市圾叼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芥丧,老刑警劉巖逻翁,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)璧疗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巷蚪,“玉大人病毡,你說我怎么就攤上這事濒翻∑ò兀” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵有送,是天一觀的道長淌喻。 經(jīng)常有香客問我,道長雀摘,這世上最難降的妖魔是什么裸删? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮阵赠,結(jié)果婚禮上涯塔,老公的妹妹穿的比我還像新娘。我一直安慰自己清蚀,他們只是感情好匕荸,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枷邪,像睡著了一般榛搔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天践惑,我揣著相機(jī)與錄音腹泌,去河邊找鬼。 笑死尔觉,一個胖子當(dāng)著我的面吹牛凉袱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播侦铜,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼绑蔫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了泵额?” 一聲冷哼從身側(cè)響起配深,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嫁盲,沒想到半個月后篓叶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡羞秤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年缸托,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘾蛋。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡俐镐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出哺哼,到底是詐尸還是另有隱情佩抹,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布取董,位于F島的核電站棍苹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏茵汰。R本人自食惡果不足惜枢里,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蹂午。 院中可真熱鬧栏豺,春花似錦、人聲如沸豆胸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽配乱。三九已至溉卓,卻和暖如春皮迟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背桑寨。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工伏尼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尉尾。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓爆阶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沙咏。 傳聞我的和親對象是個殘疾皇子辨图,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

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