发送isEqual:为nil始终返回NO

cfi*_*her 9 null cocoa objective-c

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

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

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

ugh*_*fhw 16

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


Tre*_*kow 14

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

if ([nil isEqual:nil]) { ... }
Run Code Online (Sandbox Code Playgroud)

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

我的解决方案是将这个宏定义在一个方便的地方

#define IsEqual(x,y) ((x && [x isEqual:y]) || (!x && !y))
Run Code Online (Sandbox Code Playgroud)

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

if (IsEqual(obj1, obj2)) { ... }
Run Code Online (Sandbox Code Playgroud)

或不相等:

if (!IsEqual(obj1, obj2)) { ... }
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • 我宁愿制作那个宏:"(x == y)|| [x isEqual:y]",它也涵盖了所有情况,并避免了常见特殊情况下的慢速方法调用.顺便说一下,你仍然需要正常的结构来避免对x和y进行双重评估,毕竟它是一个宏. (7认同)