views:

122

answers:

2

Hey.

I saw a couple of questions here on SO, with ansers including the function isEqual: instead of the standard ==.

So far, I have only learned to use the ==, so I'm wondering what's better to use, what are the pros and cons of each? When should you use them?

Thank you.

+7  A: 

They do different things; so you need to use the appropriate one:

Consider, if you will:

NSString *a = @"Hello!";
NSString *b = a;
NSString *c = [a mutableCopy];

if (a == b) NSLog(@"This prints");
if (b == c) NSLog(@"This doesn't");
if ([a isEqual:c]) NSLog(@"This does");

In other words; == merely checks if two pointers point to the same place, and therefore are the same object; isEqual: checks if the two objects are equal; in this case a and b are the same string, while c is a new string that is equal to a, in that it has the same characters in the same order; but it has a different class and a different address.

You'll almost always want to use isEqual: for objects, and, if they have it, a more specific comparator if they are of the same class (isEqualToString:, for example).

== on the other hand you should probably only use for integer data types. (They make little sense for objects, and less for floating point numbers.)

Williham Totland
Careful, `[a copy]` may return the same object, because it is an immutable string.
dreamlax
dreamlax: True, answer updated for clarity; tho' I do believe copying an NSConstStr will yield an NSConcreteImmutableString; I might be wrong.
Williham Totland
@ Williham Totland: sending copy to a constant string just gives you the same pointer back.
JeremyP
I stand corrected.
Williham Totland
+1  A: 

isEqual will compare objects according to the method written for the receiver object

== compares the addresses of Objects (or their values for C type variables like ints

This means for say NSStrings == compares the address but isEquals: will look at the values of the string objects and so does something similar to strcmp

Note that many strings are interned so that their addresses are the same if their data is the same so == can appear to work in test cases.

Mark