gpt4 book ai didi

iphone - 如何停止我不知道的NSTimer被释放

转载 作者:行者123 更新时间:2023-12-03 16:56:16 29 4
gpt4 key购买 nike

很抱歉提出这个问题,但是现在是第三天,我试图解决这个问题,到目前为止还没有任何进展。

问题是这样的:在游戏过程中,用户回答一个问题和下一个问题之间存在停顿。同样在其他几种情况下,游戏中也会出现这种暂停。为此,我使用一个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时,我需要使计时器无效。否则,计时器将触发,然后使应用程序崩溃或弹出不属于其他 View 的内容,等等。

因此我写:
- (void)viewWillDisappear:(BOOL)animated {
[scheduleTimer invalidate];
}

现在,如果确实设置了计时器,就可以完成此工作。但是,如果没有安排这样的计时器,则应用程序将崩溃。

我尝试了可能的所有内容,包括@try(这也使应用程序崩溃,Zombie说“*-[CFRunLoopTimer无效]:消息发送到已释放实例0x567640”)。由于计时器是在完成后释放的,因此[scheduleTimer isValid]也将使应用程序崩溃。

现在,我已经非常绝望了,作为最后的选择,我正在考虑将计时器替换为不可见的UIView animateWithDuration。

但是,我认为这应该是一个非常标准的情况。我只是不知道为什么我找不到这个非常明显的任务的答案。你能帮我吗?谢谢

最佳答案

我认为问题在于NSTimer在被invalidate之前会自动释放。

因此,您应该执行以下操作:

scheduleTimer = [[NSTimer scheduledTimerWithTimeInterval:1.0 target: self selector: @selector(playFeedbackSound) userInfo: nil repeats: NO] retain];

而且您还应该在 releaseviewWillDisappear:计时器
[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;
}
}

关于iphone - 如何停止我不知道的NSTimer被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7595685/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com