3

这个问题的两个部分

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

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

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];
}

多谢你们!

4

5 回答 5

17

正确的?是的。必要的?不,Objective-C 只是#defines nilto (void *)0,用 C 术语来说,这是错误的。所以简单地写

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

足够了。此外,由于 Objective-C 具有 message-eating nil,您可以在某些情况下简单地省略检查。(例如,如果块中没有第二行if,您可以简单地[obj someMessage]不加选择地调用。)

于 2009-11-18T20:33:30.630 回答
12

这是正确的,因为它会给你你期望的结果,但是多余的。只需使用以下内容就足够了:

if (obj) {

或者

if (obj != nil) {
于 2009-11-18T20:31:32.060 回答
4

您可以简单地使用if (obj). 据objc.hnil是一#define__DARWIN_NULL。在 中查找/usr/include/sys/_types.h,我们看到它__DARWIN_NULL被定义为0L0(void *)0,这取决于平台以及您使用的是 C 还是 C++ 编译器。但最后,nil总是评估为假,所以更简单if (obj)就足够了。

于 2009-11-18T20:37:26.957 回答
4

不是对您的问题的直接回答,而是对第 2 部分暗示的问题的回答:除了发送消息并查看它是否符合您的要求之外,无法判断指针是否引用了“有效对象”。有各种各样的东西不是零,但对于大多数用途来说仍然不是“有效对象”。例如,一个对象变量可能指向:

  • 被释放的对象曾经存在的垃圾空间
  • 一个新对象被分配来代替变量应该指向的对象
  • 您不小心将变量设置为的 int
  • 您不小心将变量设置为的 AC 字符串,而不是 NSString

如果出现这些情况,则无法在运行时进行测试。你必须确保你的代码没有错误,这些错误会使变量进入这样的状态。

于 2009-11-18T20:48:53.703 回答
0

if (obj == nil) then if (obj) 将评估为假。你不需要两者。

于 2009-11-18T20:32:38.183 回答