正确发布NSTimer的方法?

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.

还要注意这是如何打破保留周期的:

  • 您和您的计时器都保留计时器目标.
  • 你在正常时间打了dealloc.
  • 然后,您将使计时器无效并释放计时器目标.
  • 然后取消分配计时器目标.