Можем ли мы использовать объекты NSMutable как члены не-NSMutable класса - PullRequest
2 голосов
/ 06 мая 2011

Предположим, у нас есть простой класс NSDictionary, может ли один из его объектов быть объектом NSMutableDictionary? Когда мы редактируем значение в объекте NSMutableDictionary, мы редактируем только значения объекта NSDictionary. Поскольку мы не редактируем объект NSDictionary, должна ли это быть проблема для не изменяемого класса NSDictionary?

1 Ответ

6 голосов
/ 06 мая 2011

Изменчивость класса коллекции относится только к возможности изменять коллекцию в целом, а не ее членов. Коллекция на самом деле просто состоит из указателей на объекты, которые она содержит; ничего о них не изменилось. Помещение объекта в неизменяемую коллекцию не меняет собственную способность объекта к изменению.

Итак, да, вы можете без труда изменить 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"
...