发送isEqual:为nil始终返回NO

时间:2011-05-06 17:20:00

标签: objective-c cocoa null

如果你发送isEqual:对于碰巧为零的对象,你总是得不到。

这是预期的行为吗?要成为一个功能而不是一个bug,如果另一个对象也是nil,我希望它返回YES,否则返回NO?从语义上讲,这似乎是正确的行为。

如果我的期望不正确,推荐的进展是什么?在发送isEqual :(和朋友)之前检查nil?

3 个答案:

答案 0 :(得分:16)

是的,这是预期的行为。对nil的任何消息都将返回一个结果,该结果相当于所请求类型的0。由于布尔值为0,因此为结果。

答案 1 :(得分:14)

这是Objective-C的预期行为。这基本上意味着这样做

if ([nil isEqual:nil]) { ... }

评估为NO。即使它没有意义,但在查看它时 - 即使它很烦人 - 能够将消息发送到nil实际上是关于Objective-C的一个非常酷的事情。有时会为你节省很多代码。

我的解决方案是将此宏定义为方便的

#define IsEqual(x,y) ((x && [x isEqual:y]) || (!x && !y))

所以当我需要测试两个对象是否相等时:

if (IsEqual(obj1, obj2)) { ... }

或不相等:

if (!IsEqual(obj1, obj2)) { ... }

希望这有帮助。

答案 2 :(得分:2)

预计有两个原因:(1)在Objective-C中,向nil发送消息始终返回false-y值(nilNO,{{ 1}},0等;或者,更一般地说,0.0,可以根据方法的预期返回类型进行解释; (2)0表示未知值,两个未知值不一定相等。

如果您想查看对象是否为nil,请使用nilif (!obj)