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

rus*_*elf 7 iphone objective-c

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

if (timeoutTimer) [timeoutTimer invalidate];
Run Code Online (Sandbox Code Playgroud)

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

Chu*_*uck 16

仅仅因为变量设置nil为非其他值并不意味着它指向有效对象.例如:

id object = [[NSObject alloc] init];
[object release];
NSLog(@"%@", object); // Not nil, but a deallocated object,
                      // meaning a likely crash
Run Code Online (Sandbox Code Playgroud)

您的计时器可能已经被删除(或者可能根本没有创建?)但是变量未设置为nil.


Mir*_*ich 6

我刚刚遇到了类似的问题,所以这是另一个可能导致检查的例子,例如你的失败.

就我而言,我从这样的字典中获取值:

NSString *text = [dict objectForKey:@"text"];
Run Code Online (Sandbox Code Playgroud)

后来,我正在使用这样的变量:

if (text) {
    // do something with "text"
}
Run Code Online (Sandbox Code Playgroud)

这导致EXC_BAD_ACCESS错误和程序崩溃.

问题是我的字典NSNull在对象具有空值(它已经从JSON反序列化)的情况下使用值,因为NSDictionary不能保存nil值.我最终解决了这个问题:

NSString *text = [dict objectForKey:@"text"];
if ([[NSNull null] isEqual:text]) {
    text = nil;
}
Run Code Online (Sandbox Code Playgroud)