其實(shí)這個(gè)問(wèn)題在現(xiàn)在來(lái)說(shuō)主要就是2個(gè)區(qū)別:
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ì)象從堆上銷(xiāo)毀雇初;而__weak僅僅是將該對(duì)象賦值給weak對(duì)象,當(dāng)該對(duì)象銷(xiāo)毀時(shí)减响,weak對(duì)象將指向nil靖诗;
__block可以讓block修改局部變量,而__weak不能辩蛋。
另外呻畸,MRC中__block是不會(huì)引起retain;但在ARC中__block則會(huì)引起retain悼院。所以ARC中應(yīng)該使用__weak。