Какая разница между alloc и allocWithZone:?
Из обсуждение форума, похоже, что большая разница - коэффициент производительности, allocWithZone: будет выделять память из определенной области памяти, что снижает стоимость обменивать.
На практике почти нет возможности использовать allocWithZone: любой может дать простой пример, чтобы проиллюстрировать, какой случай использовать allocWithZone:?
Спасибо,
Ответы
Ответ 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 может, безусловно, выполнять ту же работу.