Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compare NSDictionaries containing NSStrings

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?

like image 808
Anastasia Avatar asked Jul 19 '13 23:07

Anastasia


2 Answers

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

like image 185
cobbal Avatar answered Sep 28 '22 04:09

cobbal


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]]
like image 35
Sam Avatar answered Sep 28 '22 04:09

Sam