Question

I have two NSDictionaries containing NSStrings. To compare this two dictionaries I use isEqualToDictionary: method. The documentation on isEqualToDictionary:says

"Two dictionaries have equal contents if they each hold the same number of entries and, for a given key, the corresponding value objects in each dictionary satisfy the isEqual: test."

So, my strings are compared by isEqual: method.

The question is:
How does isEqual: work for the NSString?

Does it use isEqual: from NSObject? I've read that isEqual from NSObject just compares addresses, using ==. To prove or disprove this idea I wrote a sample:

NSString *str1 = @"sampleString";
NSString *str2 = [NSString stringWithFormat:@"%@", @"sampleString"];
BOOL result = [str1 isEqual:str2];

The result is YES, the addresses of str1 and str2 are different though.
So, either it does not use isEqual: from NSObject (what than?), or NSObject's isEqual: does something more complicated then just checking equality of addresses.

Does anybody know how does it really work?

Was it helpful?

Solution

NSString overrides isEqual: to properly compare strings, so you're perfectly fine to comparing dictionaries this way.

OTHER TIPS

isEqualToDictionary compares every object with isEqual.

In my case it doesn't work with NSString object in my dictionary. So i made a very simple workaround. I compare the description of both dictionaries. This works with dictionaries containing NSString and NSNumber and whit all objects containing a description method.

[[myDict1 description] isEqualToString:[myDict2 description]]

Compare literal descriptions of dictionaries. I'm using it in unit tests.

NSString *a = dictionary.description;
NSString *b = assertation.description;
BOOL test = [a isEqualToString:b];
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top