很抱歉提出这个问题,但现在是第3天我试图解决这个问题,到目前为止还没有进展。
问题在于:在游戏中,用户回答问题和下一个问题之间存在暂停。此外,在其他几个案例中,游戏中也存在此类暂停。为此,我使用了一个NSTimer。
在......我有:
@property(nonatomic,retain) NSTimer *scheduleTimer;
和.m
@synthesize scheduleTimer;
scheduleTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target: self selector: @selector(playFeedbackSound) userInfo: nil repeats: NO];
现在这很好用。但是当用户退出ViewController时,我需要使计时器无效。否则,计时器将触发,然后使应用程序崩溃或弹出不属于其他视图的内容等。
因此我写道:
- (void)viewWillDisappear:(BOOL)animated {
[scheduleTimer invalidate];
}
现在,如果实际设置了计时器,这将完成工作。但如果没有安排这样的计时器,应用程序就会崩溃。
我可能尝试了所有内容,包括@try(它也会崩溃应用程序,Zombie说“ * - [CFRunLoopTimer invalidate]:消息发送到解除分配的实例0x567640”)。由于计时器在完成后被释放,[scheduleTimer isValid]也会使应用程序崩溃。
现在我已经非常绝望,作为最后的手段,我正在考虑用UIView animateWithDuration替换计时器,它不会显示任何内容。
但是,我认为这应该是一个非常标准的情况。我只是不知道为什么我找不到这个非常明显的任务的答案。你能帮我吗?谢谢
答案 0 :(得分:1)
我认为问题是NSTimer
会在您invalidate
之前自动释放。
所以你应该这样做:
scheduleTimer = [[NSTimer scheduledTimerWithTimeInterval:1.0 target: self selector: @selector(playFeedbackSound) userInfo: nil repeats: NO] retain];
您还应release
viewWillDisappear:
计时器
[scheduleTimer release];
但更好的解决方案可能是使用dot属性语法来保留/释放:
self.scheduleTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target: self selector: @selector(playFeedbackSound) userInfo: nil repeats: NO];
然后:
- (void)viewWillDisappear:(BOOL)animated {
if (self.scheduleTimer != nil) {
[self.scheduleTimer invalidate];
self.scheduleTimer = nil;
}
}
答案 1 :(得分:0)
创建一个方法来使计时器失效,该计时器也将属性设置为nil:
- (void) invalidateTimer
{
if (self.scheduleTimer) {
[self.scheduleTimer invalidate];
self.scheduleTimer = nil;
}
}
...然后在您使计时器无效时调用该方法。例如:
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear: animated];
[self invalidateTimer];
}
使用以下方法确保您的计时器被保留:
self.scheduleTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target: self selector: @selector(playFeedbackSound) userInfo: nil repeats: NO];