关于NSTimer的问题并保留

Vol*_*da2 0 memory iphone nstimer retain

这段代码效果很好

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

这段代码得到CFRelease.但为什么?我使用保留财产

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

bbu*_*bum 10

不是很多......但是:

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

这最终将保留计时器3次并自我保护一次.

  1. 定时器+1为-retain
  2. 定时器+1用于安排它
  3. 定时器+1用于属性分配

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

定时器在被触发时将释放一次(因为它将从运行循环中取消预定). self将在计时器失效或释放时释放(您不必关心).

因此,您需要考虑两个保留计数.retain上面代码中的调用是噪声; 不要打扰,因为财产分配将保留它.

这使得该物业得以保留.最明显的方法是在-dealloc中释放计时器.

但是,除非您在触发计时器之前需要使计时器失效,否则没有理由让一个实例变量完全引用计时器.即使你有一个iVar,只要你在你的timerFired:方法中设置self.timer = nil就没有理由保留定时器(如果你在任何地方无效,就把它设置为nil).