gpt4 book ai didi

ios - NSTimer 在 ARC 项目中崩溃

转载 作者:行者123 更新时间:2023-11-29 03:45:53 24 4
gpt4 key购买 nike

我在 MessagePlayerViewController(UIViewController) 中有以下一对函数,它们移动 slider 以反射(reflect) AVAudioPlayer 的播放进度:

-(void)startTrackingPlayback
{
if(!self.isPlaying)
{
self.isPlaying = YES;
self.playbackTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(updateProgress) userInfo:nil repeats:YES];
}
}

-(void)stopTrackingPlayback
{
if(self.playbackTimer)
{
if(self.playbackTimer.isValid)
{
[self.playbackTimer invalidate];
self.playbackTimer = nil;
}
}
self.isPlaying = NO;
}

间歇性地,并且没有遵循明显的模式,我在堆栈的前两项中得到一个 Exec Bad Access ,如下所示:

0 objc_msgSend
1 [MessagePlayerViewController stopTrackingPlayback];

怎么会这样呢?我在调用 isValid 之前检查计时器是否存在,并在使其无效之前检查 isValid

使用断点可以看到计时器确实存在,但是当我将其设置为nil时会发生错误。如果我删除这一行,我会在该行收到相同的错误:

[self.playbackTimer invalidate];

最佳答案

我建议检查您使用 MessagePlayerViewController 的方式。在我看来,堆栈跟踪和您描述的行为都暗示了这样一个事实: Controller 比您的计时器更早被释放。

考虑到调度计时器的运行循环将使计时器保持事件状态。

也许修复就像在 Controller 的 dealloc 方法(或其他有意义的地方)中调用 invalidate 一样简单,但如果您不提供更多代码,这不可能说。

关于ios - NSTimer 在 ARC 项目中崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17771501/

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