好的,这是我收到的错误:
-[CFRunLoopTimer invalidate]: message sent to deallocated instance 0x109b05a0 (gdb)
这是导致崩溃的代码:
if (waitingOpponentTimer) {
[waitingOpponentTimer invalidate]; //<-- Crash/error occurs here
waitingOpponentTimer = nil;
}
以及其他地方:
NSTimer* waitingOpponentTimer;
并且:
waitingOpponentTimer = [NSTimer scheduledTimerWithTimeInterval:10.0f target:self selector:@selector(waitingOpponentTimeOut)userInfo:nil repeats:NO];
任何地方都没有发生 waitingOpponentTimer ,只有我上面显示的那些。 waitingOpponentTimeOut 操作仅设置一些变量,对计时器或 waitingOpponentTimer 不执行任何操作。
我已尝试以下所有 IF 语句来防止到达无效语句:
if (waitingOpponentTimer) {
if ([waitingOpponentTimer retainCount] > 0) {
if (waitingOpponentTimer.isValid) {
if (waitingOpponentTimer != nil) {
但在所有情况下,它仍然会通过 IF 语句,然后使用 invalidate 语句导致崩溃。
所以我的问题是,当对象 isValid 且不为 nil 并且其保留计数大于零时,为什么/如何 invalidate 会导致错误?
是否有另一种方法来检查这一点以防止达到无效状态?
我对 iPhone 编程完全是菜鸟,我花了几个小时在谷歌上搜索试图弄清楚这一点,但无法弄清楚我做错了什么。任何帮助和建议表示赞赏!
编辑:
只是为了澄清一下,我使用它在计时器运行之前手动停止计时器。我知道如果它用完,它就会自行失效,这就是为什么我使用 IF 语句来检查它是否已经失效(但它不起作用)。所以我认为当崩溃发生时计时器已经失效了,但是我如何检查它是否已经失效?
编辑:
好的,我在下面标记了正确答案。我不知道当计时器未被保留并且本身已经失效时,代码通过 IF 语句获取是否确实有原因,但答案是如果要在 IF 语句中使用计时器,则始终使用 RETAIN 。
以下是相关信息:如果不需要使其失效,是否有理由保留预定的 NSTimer?