循环引用的常见的三种场景
-
delegate
在委托问题上出现循环引用问题已经是老生常谈了,规避该问题的杀手锏也是简单到哭:声明delegate时请用assign(MRC)或者weak(ARC),千万别手贱玩一下retain或者strong,毕竟这基本逃不掉循环引用了! -
block
block在copy时都会对block内部用到的对象进行强引用(ARC)或者retainCount增1(非ARC)。在ARC与非ARC环境下对block使用不当都会引起循环引用问题,一般表现为,某个类将block作为自己的属性变量,然后该类在block的方法体里面又使用了该类本身,简单说就是self.someBlock = ^(Type var){ [self dosomething]; //或者 self.otherVar = XXX; //或者 _otherVar = ... };
block的这种循环引用会被编译器捕捉到并及时提醒。
-
NSTimer
timer都会对它的target进行retain,我们需要小心对待这个target的生命周期问题,尤其是重复性的timer。(NSTimer初始化后,self的retainCount加1。 那么,我们需要在释放这个类之前,执行[timer invalidate];否则,不会执行该类的dealloc方法。)
网友评论