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

Какая разница между alloc и allocWithZone:?

Из обсуждение форума, похоже, что большая разница - коэффициент производительности, allocWithZone: будет выделять память из определенной области памяти, что снижает стоимость обменивать.

На практике почти нет возможности использовать allocWithZone: любой может дать простой пример, чтобы проиллюстрировать, какой случай использовать allocWithZone:?

Спасибо,

4b9b3361

Ответ 1

Когда один объект создает другой, его иногда хорошая идея, чтобы убедиться они оба выделены из одного и того же область памяти. Метод зоны (объявлено в протоколе NSObject) могут быть использованы для этой цели; Это возвращает зону, в которой приемник расположен.

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

-(id)init {
  if (self = [super init]) {
    someIvar = [[SomeOtherClass allocWithZone:[self zone]] init];
  }

  return self;
}

Ответ 2

Из Apple documentation:

Этот метод существует по историческим причинам; зон памяти больше нет используется Objective-C.

Ответ 3

Хороший пример использования allocWithZone: это когда вы реализуете протокол NSCopy, который позволяет вам копировать свои настраиваемые объекты (глубокая копия/копировать по значению), например:

(1) ClassName *newObject = [currentObject copy]; //results in newObject being a copy of currentObject not just a reference to it

Протокол NSCopy обеспечивает реализацию метода:

(2) -(id)copyWithZone:(NSZone *)zone;

При копировании объекта передается сообщение "копировать", как указано выше (1), когда указано как "copyWithZone" отправляет сообщение методу (2). иначе вам не нужно ничего делать, чтобы получить зону самостоятельно.

Теперь, когда у вас есть "зона", отправленная этому сообщению, вы можете использовать ее для обеспечения того, чтобы копия была сделана из памяти в том же регионе, что и оригинал.

Это можно использовать как:

-(id)copyWithZone:(NSZone *)zone
{
   newCopy = [[[self class]allocWithZone:zone]init]; //gets the class of this object then allocates a new object close to this one and initialises it before returning
   return(newCopy);
}

Это единственное место, где я знаю, что allocWithZone фактически используется.

Ответ 4

Я использую allocWithZone в singleton. Как заметил Форрест, переменные, созданные из той же области памяти. Таким образом, другие классы могут использовать или получать к ним доступ из одной и той же зоны памяти. Сохраняйте пространство памяти при запуске приложения.

Ответ 5

В Справочник основных функций все функции Zone теперь предваряются предупреждением о том, что зоны будут игнорироваться.

Зоны игнорируются в iOS и 64-битной среде выполнения OS X. Вы не должны использовать зоны в текущей разработке.

NSCreateZone
NSRecycleZone
NSSetZoneName
NSZoneCalloc
NSZoneFree
NSZoneFromPointer
NSZoneMalloc
NSZoneName
NSZoneRealloc
NSDefaultMallocZone

Ответ 6

Даже если в документации Apple указано, что allocWithZone:

существует по историческим причинам; зоны памяти больше не используются Objective-C. Вы не должны переопределять этот метод.

и

Зоны игнорируются в iOS и 64-битной среде выполнения OS X. Вы не должны использовать зоны в текущей разработке.

в реальности я переопределил его в классе Objective-C (в полном проекте Objective-C), и метод вызывается, когда я делаю [[Mylass alloc] init], даже если сборка работает на iPhone 6s.

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