所谓循环引用,是因为当前控制器在引用着block,而block又引用着self即当前控制器,这样就造成了循环引用。一般来说我们总会在设置Block之后,在合适的时间回调Block,而不希望回调Block的时候Block已经被释放了,所以我们需要对Block进行copy,copy到堆中,以便后用。当一个Block被Copy的时候,如果你在Block里进行了一些调用,那么将会有一个强引用指向这些调用方法的调用者。其有两个规则:
如果你是通过引用来访问一个实例变量,那么将强引用至self
如果你是通过值来访问一个实例变量,那么将直接强引用至这个“值”变量
那么,实际应用中,情况怎样呢?根据实验,常见规律如下:
MRC: 不会引起循环应用,block中可以大胆应用self,不过现在也几乎不用mrc模式了。
ARC:block为实例对象的一个属性,这时,block内无论是调用self的方法还是其它属性,都要循环,不能用self;如果block是一个局部变量或者是一个方法的参数,则不会引起循环引用。