if(obj&& obj!= nil)是否正确且必要?

时间:2009-11-18 20:28:19

标签: iphone objective-c cocoa cocoa-touch null-test

这个问题的两个部分

1)对正在发生的事情的理解是正确的吗? “if(obj)”正在测试指针是否不是0x0,也就是设置为整数存储器地址
“if(obj!= nil)”将对象的内存地址与通用零对象的内存地址进行比较

2) 所以在我不知道变量是否指向任何东西的情况下,如果是,我也不知道该对象是有效对象还是nil。我希望根据这些信息做各种各样的事情,而不仅仅是将信息传递给obj,如果它是零,我认为这是安全的。这段代码是正确还是必要的?

if (obj && obj != nil) {
    // Do a bunch of things that should only happen if obj is pointing to a valid object
    [obj someMessage];
    [anotherObj someOtherMessage];
}

谢谢你们!

5 个答案:

答案 0 :(得分:17)

正确?是。必要? No. Objective-C只是#define s nil(void *)0,用C表示,是假的。所以简单写一下

if (obj) {
    [obj someMessage];
    [anotherObj someOtherMessage];
}

就足够了。此外,由于Objective-C有消息传递nil,您可以在某些情况下简单地省略检查。 (例如,如果if区块中没有第二行,则可以简单地不加区分地呼叫[obj someMessage]。)

答案 1 :(得分:12)

这是正确的,因为它会给你你期望的结果,但多余。只需使用即可:

if (obj) {

if (obj != nil) {

答案 2 :(得分:4)

您只需使用if (obj)即可。根据{{​​1}},objc.hnil的{​​{1}}。在#define中,我们看到__DARWIN_NULL被定义为/usr/include/sys/_types.h__DARWIN_NULL0L,具体取决于平台以及您是否使用C或C ++编译器。但最后,0始终评估为false,因此更简单的(void *)0就足够了。

答案 3 :(得分:4)

不是你问题的直接答案,而是第2部分隐含的问题:没有办法告诉指针是否引用了“有效对象”,而不是发送消息并查看它是否符合你的要求。有各种各样的东西不是零但仍然不是大多数用途的“有效对象”。例如,对象变量可能指向:

  • 解除分配的对象过去生活的垃圾空间
  • 已分配的新对象代替变量应指向的对象
  • 您意外将变量设置为
  • 的int
  • 您意外将变量设置为而不是NSString
  • 的C字符串

如果出现任何这种情况,就无法在运行时进行测试。你必须确保你的代码没有可以将变量放入类似状态的错误。

答案 4 :(得分:0)

如果(obj == nil)则if(obj)将评估为false。你不需要两者。

相关问题