what is difference between alloc and allocWithZone:? what is difference between alloc and allocWithZone:? objective-c objective-c

what is difference between alloc and allocWithZone:?


When one object creates another, it’s sometimes a good idea to make sure they’re both allocated from the same region of memory. The zone method (declared in the NSObject protocol) can be used for this purpose; it returns the zone where the receiver is located.

This suggests to me that your ivars, and any objects your classes "create" themselves could make use of +allocWithZone: in this way, to make the instances they create in the same zone.

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


From Apple's documentation:

This method exists for historical reasons; memory zones are no longer used by Objective-C.


A good example for using allocWithZone: is when you are implementing the NSCopy protocol, which allows you make your custom objects copyable (deep copy / copy by value) like:

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

The NSCopy protocol ensures you implement a method:

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

When copying an object the 'copy' message you send as above (1) when stated as 'copyWithZone sends a message to the method(2). aka you don't have to do anything to get a zone yourself.

Now as you have a 'zone' sent to this message you can use it to ensure a copy is made from memory in the same region as the original.

This can be used like:

-(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);}

This is the only place I am aware allocWithZone is actually used.