繁体   English   中英

有关NSTimer和保留的问题

[英]Question about NSTimer and retain

此代码效果很好

@property (nonatomic, retain) NSTimer *timer;
self.timer = [[NSTimer timerWithTimeInterval:kAdsAppearTimeInterval target:self selector:@selector(timerFired:) userInfo:nil repeats:NO] retain];

此代码获取CFRelease。 但为什么? 我使用保留财产

self.timer = [NSTimer timerWithTimeInterval:kAdsAppearTimeInterval target:self selector:@selector(timerFired:) userInfo:nil repeats:NO];

没什么要继续的,但是:

@property (nonatomic, retain) NSTimer *timer;
self.timer = [[NSTimer timerWithTimeInterval:kAdsAppearTimeInterval target:self selector:@selector(timerFired:) userInfo:nil repeats:NO] retain];

最终将计时器保留3次,自我保留一次。

  1. 计时器+1用于-retain
  2. 计时器+1进行安排
  3. 计时器+1用于属性分配

  4. self +1作为计时器的目标

计时器在触发时将被释放一次(因为它将从运行循环中取消调度)。 计时器无效或释放时, self将被释放(您不必在意)。

因此,您需要考虑两个保留计数。 retain在上面代码中的要求是噪音。 不要打扰,因为属性分配将保留它。

剩下的财产。 最明显的方法是在-dealloc中释放计时器。

但是,除非您需要在启动计时器之前使该计时器无效,否则根本没有理由让实例变量引用该计时器。 即使您确实拥有iVar,也没有理由保留计时器,只要您在timerFired:方法中设置self.timer = nil (如果在任何地方使它无效,则将其设置为nil)即可。

对于非重复计时器,如果您需要引用实例变量,则我不建议在其声明中使用保留属性,以免造成混淆。

设置实例变量(myTimer)

 myTimer = [NSTimer scheduledTimerWithTimeInterval:myTimerInterval
                                            target:self
                                          selector:@selector(myTimerFired:)
                                          userInfo:nil
                                           repeats:NO];

当计时器启动时,您可以将实例变量标记为nil,因为自从计时器启动时释放该实例变量

- (void) myTimerFired: (NSTimer *) theTimer{

            myTimer = nil;
        //etc
    }

这样,如果您必须引用实例变量(例如,在退出View控制器时禁用计时器)

 -(void) onBack {
             if(myTimer){
                 [myTimer invalidate];
                 myTimer = nil;
              }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM