NSTimer内存泄漏

时间:2021-08-25 19:58:16

用NSTimer调用

timer = [NSTimer scheduledTimerWithTimeInterval:timerInterval

target:self

selector:@selector(timerHandler:)

userInfo:nil

repeats:YES];

方法时,如果repeats设成YES, 并且还不显示调用  [timer invalidate] 的话会造成内存泄露,这种内存泄露跟普通的循环引用不同,比如一个VC中有一个timer,此timer会被当前的runloop retain,同时timer会retain self,所以即使self中将指向timer的指针置为weak,timer本身被runloop retain,此时虽然timer和self间没有循环引用关系,但是self还是不会被释放。

关键点:解决此类内存泄漏关键点在于创建timer时不让timer强引用self,这样self就可以正常被释放,释放时在dealloc方法中调用invalidate timer去释放timer

推荐写法:

创建timer时用block的方式(iOS10及以后的系统支持block的方式,iOS10以前需要自己实现一个支持block的timer的category(可参考我实现的一个category https://github.com/panyibin/YBUtils )),弱引用self(避免self被runloop间接强引用导致不被释放),然后在self的dealloc方法中invalidate timer(释放timer)