Sending isEqual: to nil always returns NO

后端 未结 3 519
栀梦
栀梦 2021-01-02 07:58

If you send isEqual: to an object that happens to be nil, you always get NO back.

Is this the expected behavior? To be a feature instead of a bug, I would expect i

相关标签:
3条回答
  • 2021-01-02 08:15

    Yes, this is the expected behavior. Any message to nil will return a result which is the equivalent to 0 for the type requested. Since the 0 for a boolean is NO, that is the result.

    0 讨论(0)
  • 2021-01-02 08:24

    It is expected, for two reasons: (1) in Objective-C, sending a message to nil always returns a false-y value (nil, NO, 0, 0.0, etc.; or, more generally speaking, 0, which can be interpreted based on the expected return type of the method); (2) nil represents an unknown value, and two unknown values are not necessarily equal to each other.

    If you want to see if an object is nil, use if (!obj) or if (obj == nil).

    0 讨论(0)
  • 2021-01-02 08:37

    This is expected behaviour from Objective-C. This basically means that doing this

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

    evaluates to NO. Even though it doesn't make sense, when looking at it - and even though it's annoying - being able to send messages to nil is actually one of the really cool things about Objective-C. Saves you a lot of code sometimes.

    My solution is to define this macro somewhere handy

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

    So when I need to test if two objects are equal:

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

    or not equal:

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

    Hope this helps.

    0 讨论(0)
提交回复
热议问题