alloc和allocWithZone有什么区别:?

从论坛讨论来看,似乎差别很大的是性能因素,allocWithZone:将从特定的内存区域分配内存,从而降低交换成本。

在实践中,几乎没有机会使用allocWithZone:任何人都可以举个简单的例子来说明使用allocWithZone的情况:

谢谢,

当一个对象创build另一个对象时,确定它们都是从同一个内存区域分配是个好主意。 区域方法(在NSObject协议中声明)可用于此目的; 它返回接收器所在的区域。

这向我build议,你的ivars以及你自己类创build的任何对象都可以使用+allocWithZone:通过这种方式创build它们在同一个区域创build的实例。

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

从苹果的文档 :

这种方法由于历史原因而存在; 内存区域不再被Objective-C使用。

使用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实际使用的唯一的地方。

我在单身人士使用allocWithZone 。 正如Forrest所提到的,创build的variables是从同一个内存区域分配的。 因此其他类可以使用或从相同的内存区域访问它们。 在运行应用程序时节省内存空间。

在基础function参考中 ,现在所有的Zonefunction都以下面的警告开头,区域将被忽略。

iOS上的区域和OS X上的64位运行时都会忽略区域。不应在当前开发中使用区域。

 NSCreateZone NSRecycleZone NSSetZoneName NSZoneCalloc NSZoneFree NSZoneFromPointer NSZoneMalloc NSZoneName NSZoneRealloc NSDefaultMallocZone 

即使Apple的文档显示allocWithZone:

由于历史原因而存在; 内存区域不再被Objective-C使用。 你不应该重写这个方法。

iOS上的区域和OS X上的64位运行时都会忽略区域。不应在当前开发中使用区域。

实际上,我在一个Objective-C类中(在一个完整的Objective-C项目中)重写了它,并且当我执行[[Mylass alloc] init]时调用该方法,即使构build在iPhone 6s上运行。

但是我认为最好是按照文档和重写alloc方法而不是这个方法,因为alloc当然可以做同样的工作。