NSCopying и copyWithZone: - должны ли они вернуть [самостоятельно сохранить] или что-то еще? - PullRequest
0 голосов
/ 20 сентября 2011

Мне трудно понять copyWithZone.

Я знаю, что он должен возвращать копию, но если я добавляю объект в словарь, он добавляет объект «copyWithZone» в словарь. Если я сделаю фактическую копию (то есть новый объект), то объект, добавленный в словарь, не будет тем же объектом. Однако, если я только увеличу количество сохранений, то технически это не копия.

Должен ли я просто сохранить себя или сделать настоящую копию?

1 Ответ

2 голосов
/ 20 сентября 2011

copyWithZone: должен возвращать неизменный объект (если есть неизменяемые и изменяемые версии класса). Если оригинал неизменен, просто сохранить и вернуть оригинал будет безопасно, поскольку ни один из владельцев не сможет изменить объект. В противном случае (то есть оригинал является изменяемым или неизменяемая / изменяемая дихотомия не применяется), верните копию.

Что касается NSDictionary и NSMutableDictionary, обычно копируются только ключи (элементы копируются, только если вы явно говорите с помощью -initWithDictionary:copyItems:), что необходимо в качестве внутренней структуры данных словарь зависит от ключевых значений. Если вы измените ключ, используемый словарем, это повредит структуру данных словаря, и вы больше не сможете получить элемент для этого ключа или, что еще хуже.

...