Objective-C - alloc和allocFromZone之间的区别?

时间:2011-11-16 03:10:35

标签: objective-c alloc

  

可能重复:
  what is difference between alloc and allocWithZone:?

我读过一篇文章,提到使用allocWithZone有助于通过使用更接近对象本身的内存位置来提高性能。这是真的?是否建议使用allocWithZone代替alloc? alloc和allocWithZone有什么区别?

证明的例子是:

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

   return self;
}

2 个答案:

答案 0 :(得分:3)

First ARC禁止在对象上调用zone。由于所有事情都在以这种方式移动,这似乎是不使用allocWithZone的充分理由。

我知道使用allocWithZone有一个很好的用途,符合NSCopying

@protocol NSCopying
- (id)copyWithZone:(NSZone *)zone;
@end

虽然你可以完全忽略zone参数,但我喜欢这样做:

-(id)copyWithZone:(NSZone *)zone{
    SampleClass *copy = [[SampleClass allocWithZone:zone] init];
    copy->_myString = [_myString copyWithZone:zone];
    return copy;
}

除此之外,我认为除了张贴previous question之外,还有更多话要说。

答案 1 :(得分:2)

直接来自the horse's mouth

  

不再需要使用NSZone - 无论如何它们都会被现代Objective-C运行时忽略

(这是来自ARC发行说明,对于那些在Apple再次破坏其文档结构后阅读此内容的人。)

内存区域曾经有点有用,但Cocoa已经彻底摆脱了它们。 NSZone就像一个残留的尾巴,ARC和libauto GC都将它切断了。正如Apple工程师Bill Bumgarner在关于bryanmac欺骗的评论中指出的那样,他们只是笨拙而且在Cocoa中并没有发挥很大作用。