我在Stack Overflow上看到很多帖子警告Objective-C用户不,以便将对象与==
运算符进行比较。例如,始终建议不要使用以下内容。
if (string1 == string2) {} // string1 and string2 are both of type NSString *
我理解此警告,因为在这种情况下==
运算符会检查指针相等,而不是string1
和string2
的实际值。如果是这种情况,为什么我经常会看到人们将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
比较时放弃?
感谢您的时间。
答案 0 :(得分:3)
使用==测试指针相等性,这似乎是你想要在这种特殊情况下测试的。您正在检查某个指针是否为零指针。具体来说,指针等于零。正如您所指出的,比较对象更复杂。对象之间的平等通常依赖于两个对象的某些内部部分是“相同的”。
在字符串的情况下,“相等”可以表示“具有相同的字符”,但它也可以表示“具有相同的字符(忽略大写)”。在某些情况下,您可能希望nil字符串等于空字符串,甚至是只有空格的字符串。关键是你必须理解确定相等性的不同方法,以便为你的对象实现你自己的相等定义。
请注意,在比较字符串或数组之类的东西时,检查指针相等性几乎绝不是您想要使用的。有一些有趣的优化可以让你失望。例如,所有空的NSArray都指向同一个单例对象。
答案 1 :(得分:1)
nil
类似于C中的NULL
或C ++中的std::nullptr
。基本上没什么意义。
当Objective-C中的对象未分配(尚未分配)时,指针将为nil
。
因此if (obj == nil)
会检查obj
是否已分配(或初始化,因为它们经常一起发生)
在编写自定义初始值设定项或检查某个对象是否存在时,通常会使用此技术。