哪种情况下Block下使用self不会造成循环引用

所谓循环引用,是因为当前控制器在引用着block,而block又引用着self即当前控制器,这样就造成了循环引用。一般来说我们总会在设置Block之后,在合适的时间回调Block,而不希望回调Block的时候Block已经被释放了,所以我们需要对Block进行copycopy到堆中,以便后用。当一个BlockCopy的时候,如果你在Block里进行了一些调用,那么将会有一个强引用指向这些调用方法的调用者。其有两个规则:

如果你是通过引用来访问一个实例变量,那么将强引用至self

如果你是通过值来访问一个实例变量,那么将直接强引用至这个“值”变量

那么,实际应用中,情况怎样呢?根据实验,常见规律如下:

MRC: 不会引起循环应用,block中可以大胆应用self,不过现在也几乎不用mrc模式了。

ARC:block为实例对象的一个属性,这时,block内无论是调用self的方法还是其它属性,都要循环,不能用self;如果block是一个局部变量或者是一个方法的参数,则不会引起循环引用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容