是(变量)与Objective-C中的if(变量!= nil)相同

时间:2009-02-11 01:47:08

标签: objective-c iphone

我在iPhone项目的这一行获得了EXC_BAD_ACCESS(SIGBUS):

if (timeoutTimer) [timeoutTimer invalidate];

令我难过的是我不明白该行怎么会崩溃,因为if语句是为了检查nil。我是否误解了Objective-C的工作方式,或者在崩溃语句中的行号有时会出现错误的行?

3 个答案:

答案 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)

他们应该是一样的。也许行号实际上是不正确的。

在代码中查找其他可能的错误,看看是否有任何错误。