前言:打印retainCount? ??
eg:在block內(nèi)部使用self不提示循環(huán)引用??(self !->testBlock->self)(這種情況block外部和內(nèi)部self的引用計(jì)數(shù)相同)
1、在block內(nèi)部使用self提示循環(huán)引用??(self->testBlock->self)
2蜂怎、使用(__weak typeof(self) weakSelf = self;)解除??(這時(shí)block內(nèi)部weakSelf比和self的引用計(jì)數(shù)+1菇存,但是內(nèi)部不強(qiáng)引用self习柠,不構(gòu)成循環(huán)引用)(問題:如果self在block內(nèi)部使用之前銷毀(不被持有)芳来,weakSelf的生命周期和self是一樣的梆暮,導(dǎo)致weakSelf也銷毀)(將強(qiáng)引用的對(duì)象轉(zhuǎn)為弱引用指針捉超,防止了 Block 和對(duì)象之間的循環(huán)引用)
3拼岳、使用(__strongtypeof(weakSelf) strongSelf = weakSelf;)(這時(shí)block內(nèi)部在這行代碼前weakSelf比和self的引用計(jì)數(shù)+1枝誊,之后weakSelf比和self的引用計(jì)數(shù)+2,strongSelf和self引用計(jì)數(shù)一樣)(將weakSelf 的弱引用轉(zhuǎn)換成 strongSelf 這樣的強(qiáng)引用指針惜纸,防止了多線程和 ARC 環(huán)境下弱引用隨時(shí)被釋放的問題)
注意??:
一绝骚、weakSelf 位于 Block 的外面,strongSelf 位于 Block 的里面祠够。從內(nèi)存管理的角度來看压汪,weakSelf 是要比 strongSelf 的聲明周期要長(zhǎng)的。這樣就形成了從弱引用到強(qiáng)引用古瓤,再從強(qiáng)引用到弱引用的一種變化止剖,也稱作 weak-strong dance。
二落君、之所以在Block的代碼執(zhí)行之前加上這樣一個(gè)非nil判斷穿香,是為了防止在把 weakSelf 轉(zhuǎn)換成 strongSelf 之前 weakSelf 就已經(jīng)為 nil 了,這樣才能確保萬無一失绎速。