在我的 dealloc 方法中释放 NSTimer 的正确方法是什么?它是用以下代码创建的?
-(void)mainTimerLoop {
mainTimer = [NSTimer scheduledTimerWithTimeInterval:1/10
target:self
selector:@selector(gameLoop)
userInfo:nil
repeats:YES];
}
Thanks
按照你这样做的方式,你永远不会击中dealloc
。计时器保留其目标。在这种情况下,这意味着计时器已保留您。在其失效之前,它不会释放您。由于您创建了计时器,因此您还必须在之前的某个时刻使其无效dealloc
,因为计时器的保留会阻止你的对象被dealloc
ed.
您有两个选择:
- 找到另一个地方使计时器无效(视图离开屏幕,应用程序正在终止,你有什么)
- 将其他内容设置为计时器的目标。
以后者为例:
@interface GameLoopTimerTarget : NSObject {
id owner; /* not retained! */
}
- (id)initWithOwner:(id)owner;
- (void)timerDidFire:(NSTimer *)t;
@end
@implementation GameLoopTimerTarget
- (id)initWithOwner:(id)owner_ {
self = [super init];
if (!self) return nil;
owner = owner_;
return self;
}
- (void)timerDidFire:(NSTimer *)t {
#pragma unused (t)
[owner performSelector:@selector(gameLoop)];
}
@end
/* In your main object… */
/* assume synthesized:
@property (retain, NS_NONATOMIC_IPHONE_ONLY) GameLoopTimer *mainTimerTarget; */
- (void)mainTimerLoop {
self.mainTimerTarget = [[[GameLoopTimerTarget alloc] initWithOwner:self] autorelease];
mainTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0 target:self.mainTimerTarget selector:@selector(timerDidFire:) userInfo:nil repeats:YES];
}
- (void)dealloc {
/* other stuff */
[timer invalidate], timer = nil;
[mainTimerTarget release], mainTimerTarget = nil;
/* more stuff */
[super dealloc];
}
注意时间间隔是怎样的1.0/10.0
- 这也可以写成0.1
, 但它cannot被写1/10
,因为该除法将截断为0.0
.
另请注意这如何破坏保留周期:
- 您和您的计时器都保留计时器目标。
- 您在正常时间点击了dealloc。
- 然后,您使计时器无效并释放计时器目标。
- 然后计时器目标被释放。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)