我们知道,循环引用指的是双方直接或者间接持有(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。这样,就产生了“持有环”。