Является ли NSMutableDictionary в NSDictionary еще изменчивым?

Вопрос так же прост, как и название:

Является ли NSMutableDictionary в NSDictionary еще изменчивым? Выключен ли mdict ниже?

NSMutableDictionary *mdict = [[NSMutableDictionary alloc] init];
NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:mdict, @"key", nil];

И является ли NSDictionary в NSMutableDictionary еще неизменным?

Кроме того, что, если это массив/набор вместо словаря?

3 ответа

Абсолютно! Мутабельность объекта не изменяется, когда вы помещаете его в контейнер.

Когда вы помещаете изменяемый словарь в другую коллекцию, изменяемую или неизменяемую, эта коллекция добавляет ссылку на изменяемый объект словаря, но она не меняет его каким-либо другим способом. То же самое касается размещения неизменяемых объектов в коллекции: коллекции ссылаются на эти объекты, не изменяя их характер.

Это остается верным, пока ваш объект находится в памяти. Если вы сериализуете его и затем десериализуете обратно, процесс десериализации может удалить изменчивость. Например, если вы сохраните NSMutableDictionary в NSUserDefaults а затем прочитайте его, вы NSUserDefaults неизменный словарь.


Да. Объекты обычно не знают, когда их помещают в коллекцию, поэтому они не могут изменить свое поведение на основе этого. NSDictionary копирует свои ключи (именно так вы можете изменить исходный объект, не затрагивая словарь), но он просто сохраняет нормальную ссылку на значение.


Пока вы получаете доступ к своим переменным, например

NSMutableDictionary * tempDict = [mdict objectForKey: @"Key"];
 NSMutableDictionary * tempDict2 = [arrayVar objectAtIndex: index];

Временные переменные сохраняют всю функциональность по-прежнему

licensed under cc by-sa 3.0 with attribution.