美文网首页
NSTimer invaildate

NSTimer invaildate

作者: 小白猿 | 来源:发表于2019-04-03 12:52 被阅读0次
    NSLog(@"Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)self));
    
    _timer = [NSTimer scheduledTimerWithTimeInterval:TimerInterval
    target:self
    selector:@selector(timerSelector:)
    userInfo:nil
    repeats:TimerRepeats];
    
    NSLog(@"Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)self));
    
    [_timer invalidate];
    
    NSLog(@"Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)self));
    
    ######  输出为  ####
    2016-07-06 13:53:21.950 NSTimerAndDeallocDemo[2028:697020] Retain count is 7
    2016-07-06 13:53:21.950 NSTimerAndDeallocDemo[2028:697020] Retain count is 8
    2016-07-06 13:53:21.950 NSTimerAndDeallocDemo[2028:697020] Retain count is 7
    

    timer对viewController进行了强调应用,原因是因为,如果要让timer运行的时候执行viewController下面的timerSelector:,timer需要知道target,并且保存这个target,以便于在以后执行这个代码 [target performSelector:], 这里的target就是指viewController。所以,timer和viewController是相互强调引用的。 但是这样看起来,就形成了retain cycle。为了解除retain cycle,我觉得,在-(void)invalidate;这个方法下,timer之前保存的target被设置为nil,强制断开了引用环。这点和设置timer = nil是差不多的。 但是invalidate还做了另外一个动作,就是解除了runloop对timer的强调引用,使得timer成功停止。

    相关文章

      网友评论

          本文标题:NSTimer invaildate

          本文链接:https://www.haomeiwen.com/subject/tswabqtx.html