Подтвердить что ты не робот

Почему зона всегда равна нулю при реализации NSCopying?

Это может быть простой вопрос, но зачем использовать протокол NSCopying в моем классе, я получаю zone == nil

- (id)copyWithZone:(NSZone *)zone
{
    if (zone == nil)
        NSLog(@"why this is allways nil");

    (...)
}

Это называется использованием этого метода для копирования массива с объектами.

[[NSArray alloc] initWithArray:myArray copyItems:YES]];
4b9b3361

Ответ 1

Ответ Кевина и Робин является наиболее точным. Ответ на Оскар довольно близок к правильному. Но ни документальная документация Gnustep, ни причины logancautrell для существования зон не являются правильными.

Зоны были первоначально созданы - сначала NXZone, затем NSZone - чтобы объекты, выделенные из одной зоны, были относительно непрерывными в памяти, это правда. Как оказалось, это не уменьшает объем памяти, которую использует приложение; в большинстве случаев он немного увеличивает его.

Большая цель состояла в том, чтобы иметь возможность массово уничтожать множество объектов.

Например, если вы должны были загрузить сложный документ в приложение на основе документа, срыв графа объекта при закрытии документа может быть довольно значительным.

Таким образом, если все объекты для документа были выделены из одной зоны, и метаданные выделения для этой зоны также были в этой зоне, то уничтожение всех объектов, связанных с документом, было бы столь же дешевым, как просто уничтожение зоны ( который был действительно дешев - "здесь, система, верните эти страницы" - один вызов функции).

Это оказалось неработоспособным. Если бы одна ссылка на объект в зоне просочилась из зоны, ваше приложение переместило бы BOOM, как только документ был закрыт, и не было никакого способа, чтобы объект указывал все, что имело отношение к он должен остановиться. Во-вторых, эта модель также стала жертвой проблемы с дефицитом ресурсов, которая часто встречается в системе GC'd. То есть, если графический объект документа хранится на ресурсах без памяти, не было возможности эффективно очищать указанные ресурсы до разрушения зоны.

В конце концов, комбинация почти не выигрывает от производительности (как часто вы действительно закрываете сложные документы), при этом вся добавленная хрупкость создала зоны плохой идеей. Слишком поздно менять API-интерфейсы, и мы остаемся с остатками.

Ответ 2

Зона NULL просто означает "использовать зону по умолчанию". Зоны больше не используются современной средой Objective C и не могут использоваться с ARC вообще.

См. документация

Ответ 3

NSZone давно устарел. Тот факт, что он все еще находится в сигнатурах метода (например, +allocWithZone: и -copyWithZone:), предназначен для обратной совместимости.

Ответ 4

Зона - это наследие от старых дней, когда компьютеры имели 8 мегабайт или меньше ОЗУ.

Проверьте это (3.1.2 Распределение памяти и зоны):

http://www.gnustep.org/resources/documentation/Developer/Base/ProgrammingManual/manual_3.html

Существует также хорошее обсуждение этого вопроса на cocoa builder (ну, это было в списке рассылки cocoa dev) примерно с 10 лет назад. Это именно то, что говорил @bbum.

http://www.cocoabuilder.com/archive/cocoa/65056-what-an-nszone.html

По-видимому, это было документировано в документах Apple, но с некоторого момента с 2007-06-06 оно было изменено.

http://www.cocoadev.com/index.pl?NSZone

Ответ 5

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