如果你发送isEqual:对于碰巧为零的对象,你总是得不到。
这是预期的行为吗?要成为一个功能而不是一个bug,如果另一个对象也是nil,我希望它返回YES,否则返回NO?从语义上讲,这似乎是正确的行为。
如果我的期望不正确,推荐的进展是什么?在发送isEqual :(和朋友)之前检查nil?
答案 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值(nil
,NO
,{{ 1}},0
等;或者,更一般地说,0.0
,可以根据方法的预期返回类型进行解释; (2)0
表示未知值,两个未知值不一定相等。
如果您想查看对象是否为nil
,请使用nil
或if (!obj)
。