2012-02-20 3 views
2

Попытка реализовать NSCopying в первый раз, и у меня есть вопрос о subleties из NSZone:Могу ли я использовать тот же NSZone дважды?

- (id)copyWithZone:(NSZone *)zone { 
    MyClass *copy = [[[self class] allocWithZone:zone] init]; 

    copy.array = [[self.array mutableCopyWithZone:zone] autorelease]; 

    return copy; 
} 

В этом примере я использую NSZone дважды: сначала выделить объект, а затем снова выделить копия массива. Является ли это законным? Это необходимо? Я мог бы просто сделать mutableCopy, и я также рассматриваю использование -initWithArray: copyItems: как возможную альтернативу.

Каков наилучший способ? Не стесняйтесь идти в любом случае на вопрос: «Нужно ли, чтобы объекты результирующего массива были мелкой или глубокой?» Ключ для меня - безопасно ли использовать NSZone два раза.

ответ

3

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

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

Следовательно, zones have been killed off, поэтому, хотя вы, возможно, по-прежнему предпочитаете делать это так, как вы это делаете для стилистической последовательности, это не будет иметь существенных различий в том, что происходит во время выполнения.

+0

Привет, вы не уверены, что вы правы, спасибо. Не могли бы вы рассказать о том, как это влияет на NSCopying? Я больше * смущен, чем раньше. Причина для соответствия NSCopying заключается в том, что вы можете сказать [aDictionary setObject: x forKey: myNSCopyingObject]. То, что вы говорите о NSZone, ставит под вопрос, как правильно соответствовать протоколу. Очевидно, я только начал с шаблона Apple, который, по-видимому, они не обновили. – SG1

+0

@ SG1: Это то же самое для копирования, что и для создания оригинальных объектов. Вы можете использовать зону, по крайней мере номинально (так как зоны больше ничего не делают), или притворяются, что зоны не существуют, и просто используйте 'alloc' /' copy'/'mutableCopy' в вашей реализации. Твой выбор. –

Смежные вопросы