【问题标题】:In copyWithZone:, should I use zone for all allocs or just for the returned object?在 copyWithZone: 中,我应该将区域用于所有分配还是仅用于返回的对象?
【发布时间】:2009-03-30 07:08:21
【问题描述】:

假设我有这样的课程:

@interface SomeClass : NSObject<NSCopying> {
    SomeOtherClass *obj;
}

在copyWithZone:的定义中,我这样做:

SomeClass *someCopy = [[SomeClass allocWithZone:zone] init];

所以我的问题是,如果我想复制 obj,哪些是正确的/推荐的?

选项 A:

objCopy = [obj copyWithZone:zone];

选项 B:

objCopy = [obj copy];

【问题讨论】:

  • 或选项 C: objCopy = [obj copyWithZone:[self zone]];这样副本将被分配在与调用者相同的区域中。但话说回来,如果你首先使用区域。

标签: objective-c cocoa memory-management


【解决方案1】:

如果您使用的是引用计数内存管理(不是垃圾收集),您应该使用[obj copyWithZone:zone]。此外,您应该(在相同情况下)使用+allocWithZone: 而不是+alloc 来分配副本。这会为指定内存区域中的实例分配内存(请参阅 NSZone)。如果开发人员要分配 许多 个对象,这些对象将在大致相同的时间不再需要,他们可能会使用一个单独的区域。然后可以使用NSRecylceZone 在一次操作中回收整个区域,这有助于防止内存碎片。通常,不需要使用私有区域(通常会损害性能;分析您的代码!)。假设开发人员希望在特定区域中获得副本,我认为您会假设他们希望在同一区域中的所有相关实例。

-copy+alloc 方法分别调用 -copyWithZone:+allocWithZone: 方法,传递默认区域。

【讨论】:

  • 有什么特别的原因 - 引擎盖下发生了什么?
  • 区域是您分配内存的区域。这个想法是,您可以从一个区域进行一大堆相关的分配(Cocoa 对象、缓冲区等),然后释放该区域而不是其中的所有对象。在实践中,我听说,这并没有真正让你受益。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多