开发者

Objective-C modifying elements in mutable containers

I need some clarification/advice regarding modifying objects stored in mutable containers in Objective-C. Let's say I have an NSMutableArray called countries inside of which there are NSMutableDictionaries that store details about each country.

NSMutableArray *countries = [[NSMutableArray alloc] init];

NSMutabelDictionary *country = [[NSMutableDictionary alloc] in开发者_JAVA技巧it];
[country setObject: @"United States" forKey: @"Name"];

[countries addObject: country];

Later I want to modify a country stored in countries. I can do this either as:

[[countries objectAtIndex: 0] setObject: @"United States of America" forKey: @"Name"];

or as:

NSMutableDictionary *cnt = [countries objectAtIndex: 0];
[cnt setObject: @"United States of America" forKey: @"Name"];
[countries replaceObjectAtIndex: 0 withObject: cnt];

the result is the same. With my C++ background, I first thought that cnt would be a copy of the object that resides at position 0 in countries and after I modify it I have to put the modified object back into countries. However, array countries would still hold the updated country object even if I don't send it the replaceObjectAtIndex message.

I would appreciate some advice on how to deal with such situations. Is it any better to explicitly replace modified objects in mutable containers with the new one, or is it completely unnecessary?


In neither case is a copy of your NSMutableDictionary created. When you call [countries objectAtIndex: 0] you are getting a reference to the same NSMutableDictionary object that is in the countries array. Any modifications that you make to this object will therefore automatically be reflected in the instance that is returned by the countries array.

In short, you have two pointers to a single object instance, and modifying the contents of a mutable collection type does not generate a copied instance of the collection.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜