block下循環(huán)引用的問(wèn)題
__block本身并不能避免循環(huán)引用亚享,避免循環(huán)引用需要在block內(nèi)部把__block修飾的obj置為nil
__weak可以避免循環(huán)引用砚哗,但是其會(huì)導(dǎo)致外部對(duì)象釋放了之后柴罐,block 內(nèi)部也訪問(wèn)不到這個(gè)對(duì)象的問(wèn)題绵疲,我們可以通過(guò)在 block 內(nèi)部聲明一個(gè) __strong
的變量來(lái)指向 weakObj梭姓,使外部對(duì)象既能在 block 內(nèi)部保持住仪搔,又能避免循環(huán)引用的問(wèn)題
__block與__weak功能上的區(qū)別忧换。
__block會(huì)持有該對(duì)象恬惯,即使超出了該對(duì)象的作用域,該對(duì)象還是會(huì)存在的亚茬,直到block對(duì)象從堆上銷毀酪耳;而__weak僅僅是將該對(duì)象賦值給weak對(duì)象,當(dāng)該對(duì)象銷毀時(shí)刹缝,weak對(duì)象將指向nil碗暗;
__block可以讓block修改局部變量,而__weak不能梢夯。
另外言疗,MRC中__block是不會(huì)引起retain;但在ARC中__block則會(huì)引起retain颂砸。所以ARC中應(yīng)該使用__weak噪奄。