Хороший пример использования 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;
При копировании объекта сообщение «copy», которое вы отправляете, как указано выше (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 фактически используется.