标签:
1> A拥有B,B拥有C。当C需要销毁时,发现被B拥有,当B需要销毁时,发现被A用有,从而导致内存泄漏。如NSTimer(NSRunloop拥有NSTimer,NSTimer拥有self);
2> A拥有B,B拥有A。如block作为属性时,使用代理时;
打破循环引用的关键在于解除上述的拥有关系;
定时器跟Runloop协同工作,Runloop是拥有NSTimer的,同时NSTimer是拥有self的,这就导致如果没有有效地调用invalidate方法,就会导致NSTimer会一直工作下去,解决办法可以改变NSTimer的target,使target指向一个无需我们管理的一个对象,如单利:
@interface NSTimer (XXBlocksSupport) + (NSTimer *)xx_scheduledTimerWithTimeInterval:(NSTimeInterval)interval block:(void(^)())block repeats:(BOOL)repeats; @end @implementation NSTimer (XXBlocksSupport) + (NSTimer *)xx_scheduledTimerWithTimeInterval:(NSTimeInterval)interval block:(void(^)())block repeats:(BOOL)repeats { return [self scheduledTimerWithTimeInterval:interval target:self selector:@selector(xx_blockInvoke:) userInfo:[block copy] repeats:repeats]; } + (void)xx_blockInvoke:(NSTimer *)timer { void (^block)() = timer.userinfo; if(block) { block(); } } @end
标签:
原文地址:http://www.cnblogs.com/zhuyiios/p/5744379.html