[Tips]NSTimer对Target的强引用

NSTimer对Target的强引用

这是一个老坑,虽然app发生错误后经过一些调试很快定位到NSTimer,还是觉得有必要记录下。

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo

其中,API文档中清楚地解释到:

The object to which to send the message specified by aSelector when the timer fires. The timer maintains a strong reference to target until it (the timer) is invalidated.

在实际运用中,target往往是当前的调用者,比如一个ViewController。这样就形成了一个经典的循环引用问题,导致当前的ViewControler始终无法释放。

解决之道

对于Timer要始终牢记手动invalidate,并且不能在dealloc中进行invalidate。