0

可能重复:
alloc 和 allocWithZone 有什么区别:?

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

证明的例子是:

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

   return self;
}
4

2 回答 2

3

第一个 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;
}

除此之外,我认为没有比上一个问题更多的要说的了。

于 2011-11-16T03:49:16.223 回答
2

直接从马嘴里说

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

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

记忆区曾经有些用处,但 Cocoa 已经彻底远离了它们。NSZone 就像一条退化的尾巴,ARC 和 libauto GC 都将其切断。正如 Apple 工程师 Bill Bumgarner 在评论 bryanmac 的骗局时所指出的那样,它们只是笨拙且不习惯在 Cocoa 中发挥很大的作用。

于 2011-11-16T04:00:17.587 回答