Изменчивость класса коллекции относится только к возможности изменять коллекцию в целом, а не ее членов. Коллекция на самом деле просто состоит из указателей на объекты, которые она содержит; ничего о них не изменилось. Помещение объекта в неизменяемую коллекцию не меняет собственную способность объекта к изменению.
Итак, да, вы можете без труда изменить NSMutableDictionary
внутри NSDictionary
.
NSDictionary * myDict;
myDict = [NSDictionary dictionaryWithObject:
[NSMutableDictionary dictionaryWithObject:@"This is one string"
forKey:@"sampleKey"]
forKey:@"mutableDict"];
NSMutableDictionary * myMutableDict = [myDict objectForKey:@"mutableDict"];
NSLog(@"%@", [myMutableDict objectForKey:@"sampleKey"];
// Prints "This is one string"
[[myDict objectForKey:@"mutableDict"] setObject:@"Not the same as before"
forKey:@"sampleKey"];
NSLog(@"%@", [myMutableDict objectForKey:@"sampleKey"];
// Prints "Not the same as before"
Аналогично для любого объекта (который допускает изменение), содержащегося в любой неизменяемой коллекции:
@interface MyNeatObjectClass : NSObject {
NSString * neatString;
}
- (id)initWithNeatString:(NSString *)initialString;
- (void)setNeatString:(NSString *)newString;
- (NSString *)neatString;
MyNeatObjectClass * myObj = [[MyNeatObjectClass alloc]
initWithNeatString:@"Example string"];
NSLog(@"%@", [myObj neatString]); // Prints "Example string"
NSArray * arr = [NSArray arrayWithObject:myObj];
[myObj release];
// instance of MyNeatObjectClass
[[arr objectAtIndex:0] setNeatString:@"Another string"];
NSLog(@"%@", [[arr objectAtIndex:0] neatString]); // Prints "Another string"