2011-10-28 4 views
15

Это может быть простой вопрос, но почему реализации протокола NSCopying в моем классе, я получаю зоны == нольПочему зона всегда нуль при реализации NSCopying?

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

    (...) 
} 

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

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

ответ

25

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

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

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

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

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

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

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

+0

Удивительно, я надеялся, что вы ответите на это. Замечание, было ли это документировано в документах Apple в любой момент? Все, что я могу найти сегодня, это методы основания NSZone *. – logancautrell

+3

Не стесняйтесь @bbum меня в Twitter, если есть такие вопросы, которые вы хотели бы привлечь к моему вниманию. Эволюция языка (и ОС) на самом деле увлекательна. Если это когда-либо было задокументировано, это, вероятно, оставалось в течение дней Rhapsody. Я не думаю, что зоны были рекомендованы в соответствующих версиях Mac OS X. – bbum

+1

Я ценю, что ваши сообщения высоко ценятся из-за вашего уникального положения и истории. Я бы хотел, чтобы инженеры Apple провели здесь время! – logancautrell

1

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

Проверьте это (Allocation 3.1.2 Памяти и зона):

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

Существует также хорошее обсуждение этого более на какао строителя (ну это было в списке рассылки какао 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

1

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

3

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

+1

если copyWithZone устарел (что не указано в определении протокола NSCopying), как реализовать NSCopying с требуемой копиейWithZone: в эти дни? – Marcin

+3

'-copyWithZone:' не является устаревшим. 'NSZone' есть. Просто игнорируйте аргумент зоны. –

4

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

См documentation

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