iPhone: (id)copyWithZone:(NSZone *)zone : для чего нужна зона?

При реализации этого метода NSCopying в классе для включения копирования, какой параметр зоны используется? Если я устанавливаю новый объект, мне не нужно выделять его с помощью allocWithZone, поскольку alloc достаточно... Я запутался...


person Oliver    schedule 08.01.2011    source источник


Ответы (2)


Это пережиток старых времен, когда у нас было несколько «зон» для выделения. В наши дни все приложения имеют только одну зону, в которой выполняются все выделения, но класс NSZone все еще существует, и слишком много кода написано, чтобы зависеть от него. о том, что +allocWithZone: является основным методом распределения для внесения изменений.

Короче говоря, вы можете полностью игнорировать структуру NSZone, и единственная причина заботиться о +allocWithZone: — если вам нужно ее переопределить. Аналогично с -copyWithZone:, вы можете просто игнорировать зону. Если хотите, можете вызвать +allocWithZone:, проходящего в той же зоне, но это ничего не изменит.

person Lily Ballard    schedule 08.01.2011

Ознакомьтесь с NSCopying Справочник по протоколу, в частности copyWithZone:

person WrightsCS    schedule 08.01.2011
comment
По крайней мере, на мой взгляд, документация никак не объясняет, что это такое: область памяти, которую можно выделить для нового экземпляра, в лучшем случае расплывчата. - person Matthew Frederick; 08.01.2011
comment
Это не объясняется, потому что это больше не полезно. В прежние времена у вас часто были разные области памяти или зоны, которые вы могли использовать для хранения вещей, и все, что касалось зон, было связано с этим. В настоящее время современные операционные системы позволяют вам думать обо всем как о большом пуле вещей, к которым может получить доступ все, хотя теоретически зоны все еще используются (например, области памяти с отображением безопасности, махинации с файлами с отображением пользовательской памяти и т. д., но я не уверен если вы даже можете полагаться на зоны, даже работающие больше. - person Shayne; 28.08.2018