在copyWithZone:中,我应该对所有alloc使用zone还是仅对返回的对象使用zone?

时间:2009-03-30 07:08:22

标签: objective-c cocoa memory-management

假设我有这样一个类:

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

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

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

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

选项A:

objCopy = [obj copyWithZone:zone];

选项B:

objCopy = [obj copy];

1 个答案:

答案 0 :(得分:3)

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

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