一、运用NSTimer时。
(可能很多童鞋都跟我一样,接触NSTimer要比接触block早一点点。)
运用NSTimer时,必然少不了target这个概念(通常情况下,这个target就是self),而NSTimer默认会对target有强引用,因此,如果在target(self)释放之前,没有先释放或者停止NSTimer,那么就会出现循环引用引起的内存泄漏问题了。
归结于上述原因,因此,在使用NSTimer时,咱们总是在target(self)释放之前,先调用NSTimer的invalidate方法来停止NSTimer(更保险的做法是,在target的dealloc方法中置空NSTimer),如果存在NSTimer的相关运行受外界控制的情形时,则应该向外界提供停止NSTimer的方法,让外界在释放target之前,先停止NSTimer。
二、运用block时。
(终于该说block了。。。。)
当block作为属性变量存在于一个类中时,并且这个类在block的实现代码中使用了这个类自身(self),那么就会出现循环引用的现象。对于这种情形,咱们的处理方法就是像本文开头提到的那样,在block块里面,对这个类进行弱引用(weakSelf)。
三、运用delegate时。
很多童鞋都用过delegate与protocol,那么为什么delegate要用weak这个关键字来修饰呢?咱们用UITableview来简单说一下。
tableview的显示,肯定离不开控制器Controller,因为Controller已经对tableview有一层强引用,此时如果再将delegate设置为strong,那就说明tableview又强引用着Controller(因为Controller是tableview的delegate),这样,就必然存在循环引用了。
因此,在使用protocol及delegate时,通常都是将delegate设置为weak弱引用(MRC下则必须是assign)。
网友评论