[英]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用于属性分配
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.