alloc和allocWithZone有什么区别:?

时间:2010-12-23 02:02:20

标签: objective-c memory-management alloc

来自forum discussion,看起来差别很大的是性能因素,allocWithZone:将从特定内存区域分配内存,从而降低交换成本。

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

谢谢,

6 个答案:

答案 0 :(得分:47)

  

当一个对象创建另一个对象时,它就是   有时一个好主意,以确保   它们都是从同一个分配的   记忆区域。区域方法   (在NSObject协议中声明)   可以用于此目的;它   返回接收者所在的区域   位于。

这向我表明,你的ivars以及你的课程“自己创建”的任何对象都可以通过这种方式使用+allocWithZone:来制作他们在同一区域中创建的实例。

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

  return self;
}

答案 1 :(得分:30)

来自Apple的documentation

  

此方法存在历史原因;内存区域不再存在   由Objective-C使用。

答案 2 :(得分:5)

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

答案 3 :(得分:2)

我在单身人士中使用allocWithZone。正如福雷斯特所提到的,创建的变量是从相同的内存区域分配的。因此,其他类可以从相同的内存区域使用或访问它们。运行应用程序时节省内存空间。

答案 4 :(得分:2)

Foundation Functions Reference中,所有Zone函数现在都以下面的警告开头,即区域将被忽略。

  

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

NSCreateZone
NSRecycleZone
NSSetZoneName
NSZoneCalloc
NSZoneFree
NSZoneFromPointer
NSZoneMalloc
NSZoneName
NSZoneRealloc
NSDefaultMallocZone

答案 5 :(得分:0)

即使Apple的文档指出allocWithZone:

  

由于历史原因而存在; Objective-C不再使用内存区域。您不应该覆盖此方法。

  

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

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

但我认为最好遵循文档并覆盖alloc方法而不是这个方法,因为alloc当然可以做同样的工作。