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参考中 ,现在所有的Zone
function都以下面的警告开头,区域将被忽略。
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当然可以做同样的工作。