mac开发系列13:NSTimer中可能隐藏的循环引用

我们知道,循环引用指的是双方直接或者间接持有(retain)对方,形成“持有环”,导致双方都不能被正确释放(release),进而引发内存泄漏甚至更严重的后果。

NSTimer(计时器)常常被用来执行一些定时重复的任务,api如下:

  • (NSTimer *)scheduledTimerWithTimeInterval:
    (NSTimeInterval)seconds //重复任务的时间间隔
    target:(id)target //计时器调用的对象
    selector:(SEL)selector //计时器调用对象上的方法,包含具体任务内容
    userInfo:(id)userInfo
    repeats:(BOOL)repeats //YES表示重复执行任务
    从api可以看出,NSTimer将持有target,直到NSTimer失效(对于重复计时器而言,要调用invalidate方法使其失效)。

当target=self,而NSTimer又是保存在self的实例变量中,这样target就会间接持有NSTimer。这样,就产生了“持有环”。

你可能感兴趣的:(mac开发系列13:NSTimer中可能隐藏的循环引用)