这个问题的两个部分
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];
}
谢谢你们!
答案 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.h
是nil
的{{1}}。在#define
中,我们看到__DARWIN_NULL
被定义为/usr/include/sys/_types.h
,__DARWIN_NULL
或0L
,具体取决于平台以及您是否使用C或C ++编译器。但最后,0
始终评估为false,因此更简单的(void *)0
就足够了。
答案 3 :(得分:4)
不是你问题的直接答案,而是第2部分隐含的问题:没有办法告诉指针是否引用了“有效对象”,而不是发送消息并查看它是否符合你的要求。有各种各样的东西不是零但仍然不是大多数用途的“有效对象”。例如,对象变量可能指向:
如果出现任何这种情况,就无法在运行时进行测试。你必须确保你的代码没有可以将变量放入类似状态的错误。
答案 4 :(得分:0)
如果(obj == nil)则if(obj)将评估为false。你不需要两者。