代码之家  ›  专栏  ›  技术社区  ›  rustyshelf

是否与if(variable)相同?=nil)目标-c中

  •  7
  • rustyshelf  · 技术社区  · 17 年前

    在我的iPhone项目中,我在这条线上获得了一个exc-bad-u访问(sigbus):

    if (timeoutTimer) [timeoutTimer invalidate];
    

    令我困惑的是,我不明白这条线是如何崩溃的,因为if语句是要检查nil的。我是否误解了Objective-C的工作方式,或者崩溃声明中的行号有时会有错误的行?

    3 回复  |  直到 17 年前
        1
  •  16
  •   Chuck    17 年前

    只是因为变量被设置为 nil 并不意味着它指向一个有效的对象。例如:

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

    您的计时器可能已被删除(或可能根本没有创建?)但变量没有设置为零。

        2
  •  6
  •   Nate    14 年前

    我刚刚遇到了一个类似的问题,下面是另一个可能导致支票失败的例子。

    在我的例子中,我从这样的字典中得到了价值:

    NSString *text = [dict objectForKey:@"text"];
    

    稍后,我使用的变量如下:

    if (text) {
        // do something with "text"
    }
    

    这导致了 EXC_BAD_ACCESS 错误和程序崩溃。

    问题是我的字典使用了 NSNull 如果对象的值为空(已从JSON反序列化),则为 NSDictionary 不能包含nil值。最后我就这样做了:

    NSString *text = [dict objectForKey:@"text"];
    if ([[NSNull null] isEqual:text]) {
        text = nil;
    }
    
        3
  •  -1
  •   Sophie Alpert    17 年前

    它们应该是相同的。也许行数实际上不正确。

    在代码中查找与此相近的其他可能错误,并查看是否找到任何错误。