I have seen many posts here on Stack Overflow warning Objective-C users not to compare objects with the ==
operator. For example, the following is always recommended against.
if (string1 == string2) {} // string1 and string2 are both of type NSString *
I understand this warning as the ==
operator in this case checks for pointer equality, not the actual values of string1
and string2
. If this is the case, why do I so often see people comparing their objects to nil
with the ==
operator. For example, I have seen the following several times.
if (obj == nil) {} // obj is of type id, or any other object
If comparing pointers with the ==
operator is bad practice on things like NSString
s (or NSNumber
s or NSArray
s etc), then why is it so commonplace with nil
.
Is this the standard because there is only one type of nil
i.e.: nil
always equals nil
?
Why are direct comaprisons using the ==
operator frowned upon between objects, but let slip when comparing to nil
?
Thank your for your time.
Using == tests for pointer equality, which seems to be what you want to test for in this particular case. You are checking whether some pointer is a nil pointer. Specifically, a pointer that equals zero. Comparing objects is more complicated as you've pointed out. Equality between objects often relies on some internal part of the two objects being "the same".
In the case of strings, "equality" can mean "has the same characters" but it could also mean "has the same characters (ignoring capitalization)". There are also cases where you might want a nil string to equal an empty string or even a string with just whitespace. The point is that you must understand the different methods of determining equality in order to implement your own definition of equality for your objects.
Note that checking for pointer equality is almost never what you want to use when comparing things like strings or arrays. There are some interesting optimizations that can throw you off. For example, all empty NSArray's point to the same singleton object.