这段代码运行良好
@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];发布于 2011-02-07 02:11:08
没什么可说的..。但是:
@property (nonatomic, retain) NSTimer *timer;
self.timer = [[NSTimer timerWithTimeInterval:kAdsAppearTimeInterval target:self selector:@selector(timerFired:) userInfo:nil repeats:NO] retain];这将最终保留计时器3次和self一次。
self +1用于成为timer的目标
计时器将在触发时释放一次(因为它将从run循环中取消调度)。当计时器失效或释放时,self将被释放(您不必关心)。
因此,您需要考虑两个保留计数。上面代码中对retain的调用是有问题的;不用担心,因为属性赋值会保留它。
剩下的就是财产的保留。最明显的方法是在-dealloc中释放计时器。
但是,除非您需要在触发计时器之前潜在地使其无效,否则根本没有理由让实例变量引用计时器。即使您有一个iVar,只要您在timerFired:方法中设置了self.timer = nil (如果在任何地方无效,则将其设置为nil ),也没有理由保留计时器。
发布于 2013-02-04 08:09:18
对于非重复计时器,如果您需要引用实例变量,我不建议在其声明中使用retain属性,以避免混淆。
设置实例变量(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;
}
}https://stackoverflow.com/questions/4914906
复制相似问题