Ответ Кевина и Робина самый точный. Ответ Оскара довольно близок к правильному. Но ни документация Gnustep, ни причины существования зон не вполне верны.
Зоны были изначально созданы - сначала NXZone, затем NSZone - чтобы гарантировать, что объекты, выделенные из одной зоны, будут относительно смежными в памяти, что очень верно. Оказывается, это не уменьшает объем памяти, используемой приложением; в большинстве случаев оно немного увеличивается.
Большая цель состояла в том, чтобы иметь возможность массового уничтожения множества объектов.
Например, если вы загружаете сложный документ в приложение, основанное на документе, демонтирование графа объектов, когда документ закрыт, может на самом деле быть довольно значительно дорогим.
Таким образом, если все объекты для документа были выделены из одной зоны и , метаданные выделения для этой зоны были также в этой зоне, то уничтожение всех объектов, связанных с документ будет таким же дешевым, как просто уничтожение зоны (что было действительно дешево - «здесь, система, верните эти страницы» - один вызов функции).
Это оказалось неосуществимым. Если бы одна ссылка на объект в зоне просочилась из зоны, то ваше приложение отправлялось бы BOOM , как только документ был закрыт, и у объекта не было возможности сказать, что ссылается на него прекратить. Во-вторых, эта модель также стала жертвой проблемы «дефицитных ресурсов», так часто встречающейся в системе GC. То есть, если граф объектов в документе хранится в ресурсах, не связанных с памятью, не было никакого способа эффективно очистить упомянутые ресурсы перед уничтожением зоны.
В конце концов, сочетание недостаточного выигрыша в производительности (как часто вы действительно закрываете сложные документы) со всей добавленной хрупкостью сделали зоны плохой идеей. Однако уже слишком поздно менять API, и у нас остались остатки.