很抱歉问这个问题,但现在已经是第三天了,我试图解决这个问题,到目前为止没有任何进展。
问题在于:在游戏中,用户在回答一个问题和下一个问题之间有一个停顿。在其他情况下,游戏玩法中也存在这样的停顿。为此,我使用一个NSTimer。
在。h中我有:
@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]:消息发送到deallocated实例0x567640")。因为计时器在完成后会被释放,所以[scheduleTimer isValid]也会导致应用程序崩溃。
现在我已经很绝望了,作为最后的手段,我正在考虑用UIView animateWithDuration替换计时器,它不做任何可见的事情。
然而,我认为这应该是一个相当标准的情况。我只是不知道为什么我找不到这个显而易见的任务的答案。你能帮忙吗?谢谢你
我认为问题是NSTimer
在您invalidate
之前自动释放。
所以你应该这样做:
scheduleTimer = [[NSTimer scheduledTimerWithTimeInterval:1.0 target: self selector: @selector(playFeedbackSound) userInfo: nil repeats: NO] retain];
你也应该release
的定时器在viewWillDisappear:
[scheduleTimer release];
但一个更好的解决方案可能是使用点属性语法来处理retain/release:
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;
}
}
创建一个方法使计时器失效,并将该属性设置为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];