jsh*_*erk 2 iphone cocoa-touch objective-c ios ios-simulator
好的,这是我得到的错误:
-[CFRunLoopTimer invalidate]: message sent to deallocated instance 0x109b05a0 (gdb)
Run Code Online (Sandbox Code Playgroud)
以下是导致崩溃的代码:
if (waitingOpponentTimer) {
[waitingOpponentTimer invalidate]; //<-- Crash/error occurs here
waitingOpponentTimer = nil;
}
Run Code Online (Sandbox Code Playgroud)
其他地方:
NSTimer* waitingOpponentTimer;
Run Code Online (Sandbox Code Playgroud)
并且:
waitingOpponentTimer = [NSTimer scheduledTimerWithTimeInterval:10.0f target:self selector:@selector(waitingOpponentTimeOut)userInfo:nil repeats:NO];
Run Code Online (Sandbox Code Playgroud)
在任何地方都没有waitOpponentTimer出现,只有我上面显示的那些.waitingOpponentTimeOut操作只设置一些变量,对定时器或waitingOpponentTimer什么都不做.
我已经尝试了以下所有IF语句,以防止达到invalidate语句:
if (waitingOpponentTimer) {
if ([waitingOpponentTimer retainCount] > 0) {
if (waitingOpponentTimer.isValid) {
if (waitingOpponentTimer != nil) {
Run Code Online (Sandbox Code Playgroud)
但在所有情况下,它仍然通过IF语句,然后导致与invalidate语句崩溃.
所以我的问题是,当对象isValid并且不是nil并且它的retainCount大于零时,为什么/如何无效导致错误?
有没有其他方法可以检查这个以防止无效到达?
我是一个完整的iphone编程菜鸟,并花了几个小时谷歌搜索试图弄清楚,但无法弄清楚我做错了什么.任何帮助和建议赞赏!
编辑:只是为了澄清,我正在使用它在运行之前手动停止计时器.我知道如果它用完了,它会使自身无效,这就是为什么我使用IF语句来检查它是否已经失效(但它不起作用).所以我认为当发生此崩溃时计时器已经自动失效,但我如何检查它是否已经失效?
编辑:好的我在下面标出了正确的答案.我不知道在没有保留定时器并且已经使自身无效的情况下,实际上有没有理由通过IF语句获取代码,但是如果要在IF语句中使用定时器,则总是使用RETAIN .
以下是相关信息:如果您不需要使其无效,是否有任何理由保留预定的NSTimer?
你用ARC吗?
waitingOpponentTimer = [[NSTimer scheduledTimerWithTimeInterval:10.0f target:self selector:@selector(waitingOpponentTimeOut)userInfo:nil repeats:NO] retain];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2511 次 |
| 最近记录: |