__weak:弱引用变量修饰词,引用计数不会+1,本身可以避免循环引用的问题,但是其会导致外部对象释放了之后,Block内部也访问不到这个对象的问题,我们可以通过在Block内部申明一个__strong的变量来指向weakObj,使外部对象既能在Block内部保持住,又能避免循环引用的问题。
__block:Blcok内部修改外部变量修饰词,使外部变量可以在Block内部进行修改,本身无法避免循环引用的问题,但是我们可以通过在Block内部手动把blockObj赋值为nil的方式来避免循环引用的问题。另外一点就是__block修饰的变量在Block内外都是唯一的,要注意这个特性可能带来的隐患。
但是__block有一点:这只是限制在ARC环境下。在非ARC下,__block是可以避免引用循环的。
__strong:强引用变量修饰词,引用计数会+1,常用于Block内部对blockObj的引用修饰,如上面的__weak的说明。
备注:正常情况下block内部用__weak就可以了,但是有时会出现延时的操作,block内部用__weak修饰的对象会提前释放掉,所以要在block内部重新用__strong定义对象,block用完__strong会自动释放
网友评论