我在iPhone项目的这一行获得了EXC_BAD_ACCESS(SIGBUS):
if (timeoutTimer) [timeoutTimer invalidate];
令我难过的是我不明白该行怎么会崩溃,因为if语句是为了检查nil。我是否误解了Objective-C的工作方式,或者在崩溃语句中的行号有时会出现错误的行?
答案 0 :(得分:16)
仅仅因为变量设置为nil
以外的值并不意味着它指向有效对象。例如:
id object = [[NSObject alloc] init];
[object release];
NSLog(@"%@", object); // Not nil, but a deallocated object,
// meaning a likely crash
您的计时器可能已经被删除(或者可能根本没有创建?)但该变量未设置为nil。
答案 1 :(得分:6)
我刚遇到类似的问题,所以这是另一个可能导致检查失败的例子。
就我而言,我从字典中获取了这样的值:
NSString *text = [dict objectForKey:@"text"];
后来,我正在使用这样的变量:
if (text) {
// do something with "text"
}
这导致EXC_BAD_ACCESS
错误和程序崩溃。
问题是我的字典在对象具有空值(它已从JSON反序列化)的情况下使用NSNull
值,因为NSDictionary
不能保存nil值。我最终解决了这个问题:
NSString *text = [dict objectForKey:@"text"];
if ([[NSNull null] isEqual:text]) {
text = nil;
}
答案 2 :(得分:-1)
他们应该是一样的。也许行号实际上是不正确的。
在代码中查找其他可能的错误,看看是否有任何错误。