其實這個問題在現(xiàn)在來說主要就是2個區(qū)別:
block下循環(huán)引用的問題
__block本身并不能避免循環(huán)引用,避免循環(huán)引用需要在block內(nèi)部把__block修飾的obj置為nil
__weak可以避免循環(huán)引用,但是其會導(dǎo)致外部對象釋放了之后,block 內(nèi)部也訪問不到這個對象的問題,我們可以通過在 block 內(nèi)部聲明一個 __strong
的變量來指向 weakObj,使外部對象既能在 block 內(nèi)部保持住,又能避免循環(huán)引用的問題__block與__weak功能上的區(qū)別。
__block會持有該對象,即使超出了該對象的作用域,該對象還是會存在的,直到block對象從堆上銷毀;而__weak僅僅是將該對象賦值給weak對象,當(dāng)該對象銷毀時,weak對象將指向nil;
__block可以讓block修改局部變量,而__weak不能。
另外,MRC中__block是不會引起retain;但在ARC中__block則會引起retain。所以ARC中應(yīng)該使用__weak。