将对象直接比较为nil

时间:2014-05-25 18:30:22

标签: objective-c object nullable null

我在Stack Overflow上看到很多帖子警告Objective-C用户,以便将对象与==运算符进行比较。例如,始终建议不要使用以下内容。

if (string1 == string2) {} // string1 and string2 are both of type NSString *

我理解此警告,因为在这种情况下==运算符会检查指针相等,而不是string1string2的实际值。如果是这种情况,为什么我经常会看到人们将nil对象与==运算符进行比较。例如,我已经多次看到过。

if (obj == nil) {} // obj is of type id, or any other object

如果将指针与==运算符进行比较对于NSString s(或NSNumber s或NSArray s等)是不好的做法,那为什么它如此普遍?与nil

这是标准吗,因为nil只有一种类型,即:nil总是等于nil
为什么使用==运算符的直接comaprisons在对象之间不赞成,但在与nil比较时放弃?

感谢您的时间。

2 个答案:

答案 0 :(得分:3)

使用==测试指针相等性,这似乎是你想要在这种特殊情况下测试的。您正在检查某个指针是否为零指针。具体来说,指针等于零。正如您所指出的,比较对象更复杂。对象之间的平等通常依赖于两个对象的某些内部部分是“相同的”。

在字符串的情况下,“相等”可以表示“具有相同的字符”,但它也可以表示“具有相同的字符(忽略大写)”。在某些情况下,您可能希望nil字符串等于空字符串,甚至是只有空格的字符串。关键是你必须理解确定相等性的不同方法,以便为你的对象实现你自己的相等定义。

请注意,在比较字符串或数组之类的东西时,检查指针相等性几乎绝不是您想要使用的。有一些有趣的优化可以让你失望。例如,所有空的NSArray都指向同一个单例对象。

答案 1 :(得分:1)

nil类似于C中的NULL或C ++中的std::nullptr。基本上没什么意义。

当Objective-C中的对象未分配(尚未分配)时,指针nil

因此if (obj == nil)会检查obj是否已分配(或初始化,因为它们经常一起发生)

在编写自定义初始值设定项或检查某个对象是否存在时,通常会使用此技术。