Guy*_*ood 4 iphone objective-c nstimer
在dealloc方法中发布NSTimer的正确方法是什么?它是用以下代码创建的?
-(void)mainTimerLoop {
mainTimer = [NSTimer scheduledTimerWithTimeInterval:1/10
target:self
selector:@selector(gameLoop)
userInfo:nil
repeats:YES];
}
Run Code Online (Sandbox Code Playgroud)
谢谢
Jer*_*man 16
你这样做的方式,你永远不会打dealloc.计时器保留其目标.在这种情况下,这意味着计时器保留了您.在它失效之前它不会释放你.由于您创建了计时器,因此您必须在之前的某个时刻使其无效dealloc,因为计时器的保留将阻止您的对象被dealloc编辑.
您有两种选择:
作为后者的一个例子:
@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];
}
Run Code Online (Sandbox Code Playgroud)
请注意时间间隔是如何1.0/10.0- 这也可以写入0.1,但不能写入1/10,因为该分区将截断为0.0.
还要注意这是如何打破保留周期的: