what is difference between alloc and allocWithZone:?
Asked Answered
D

6

52

From forum discussion , seem like that the big difference is performance factor, allocWithZone: will alloc memory from particular memory area, which reduce cost of swapping.

In practice, almost get no chance to use allocWithZone: , anyone can give simple example to illustrate which case to use allocWithZone: ?

Thanks,

Dinsmore answered 23/12, 2010 at 2:2 Comment(3)
Note that current (2014) Apple documentation says that the zone parameter is ignored, and "This method exists for historical reasons; memory zones are no longer used by Objective-C." So the accepted answer may no longer be the right one.Goodin
From Apple's Current Docs: Zones are ignored on iOS and 64-bit runtime in macOS. You should not use zones in current development.Sacramentalism
@KristopherJohnson Then that changes the question to what was the difference between alloc and allocWithZone:?Romanticism
C
50

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;
}
Cottonweed answered 23/12, 2010 at 2:8 Comment(3)
Correct. The reality, though, is that pretty much nothing uses zones. It was originally intended to give the ability to, say, co-locate all of the objects related to a document in a zone and then bulk destroy them by simply deallocating the zone. In practice, this proved unworkable and zones haven't been used in more than a decade in the OpenStep APIs.Comradery
Thanks for that. Very informative. I figured given the lack of focus on them in the documentation that they're not exactly used much.Cottonweed
Hey! Great example of why you may want to override allocWithZone though! Search for JoeConway forums.bignerdranch.com/viewtopic.php?f=85&t=2823Excursus
D
31

From Apple's documentation:

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

Doukhobor answered 11/10, 2013 at 7:40 Comment(0)
A
5

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.

Aixlachapelle answered 18/11, 2011 at 13:44 Comment(0)
C
2

I use allocWithZone in singleton. As Forrest mentioned, the variables created allocated from the same region of memory. Thus other classes can use or access them from the same zone of memory. Save memory space when you run your app.

Coverlet answered 5/10, 2012 at 3:20 Comment(1)
I don't think this does what you think it does. allocWithZone allows you to allocate many objects into an NSZone and release them all at once with NSRecycleZone(...). NB that NSZone is not supported in the 64 bit Objective-C runtime and on iOSSacramentalism
P
2

In the Foundation Functions Reference, all of the Zone functions are now prefaced with the below warning that Zones will be ignored.

Zones are ignored on iOS and 64-bit runtime on OS X. You should not use zones in current development.

NSCreateZone
NSRecycleZone
NSSetZoneName
NSZoneCalloc
NSZoneFree
NSZoneFromPointer
NSZoneMalloc
NSZoneName
NSZoneRealloc
NSDefaultMallocZone
Psychogenic answered 27/5, 2015 at 20:53 Comment(0)
S
0

Even if the Apple's Documentation indicates that allocWithZone:

exists for historical reasons; memory zones are no longer used by Objective-C. You should not override this method.

and

Zones are ignored on iOS and 64-bit runtime on OS X. You should not use zones in current development.

in reality I overridden it in an Objective-C class (in a full Objective-C project) and the method is called when I do [[Mylass alloc] init] even if the build is running on an iPhone 6s.

But I think it's better to follow the documentation and override alloc method instead of this one because alloc can certainly do the same job.

Silma answered 29/7, 2016 at 22:20 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.