addEntriesFromDictionary: настоящий метод копирования? - PullRequest
1 голос
/ 03 августа 2011

Я пытаюсь точно понять, что происходит с этим методом, как отмечено в документации Apple:

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableDictionary_Class/Reference/Reference.html

Если я создаю NSMutableDicationary и использую addEntriesFromDictionary: для его заполнения, могу ли я сделать все, что захочу, в этот изменяемый словарь, не затрагивая исходный неизменяемый словарь, откуда пришли эти элементы?

Ответы [ 3 ]

3 голосов
/ 03 августа 2011

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

РЕДАКТИРОВАТЬ : регистрация тестового примера, как это было предложено, действительно показывает, что такое поведение.Скопированный ключ фактически будет таким же, как и исходный ключ для общего случая неизменяемого строкового ключа.

3 голосов
/ 03 августа 2011

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

Чтобы избежать этого, сделайте глубокую копию исходного словаря, прежде чем добавлять его в новый словарь:

NSDictionary *deepCopy = [[NSDictionary alloc] initWithDictionary: original copyItems: YES];
if (deepCopy) {
    [destination addEntriesFromDictionary: deepCopy];
    [deepCopy release];
}
3 голосов
/ 03 августа 2011

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

Каждый объект значения из otherDictionary отправляется сообщение retain перед добавлением в получающий словарь.Напротив, каждый ключевой объект копируется ... и копия добавляется в принимающий словарь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...