假设我有这样一个类:
@interface SomeClass : NSObject<NSCopying> {
SomeOtherClass *obj;
}
在copyWithZone:的定义中,我这样做:
SomeClass *someCopy = [[SomeClass allocWithZone:zone] init];
所以我的问题是,如果我想制作obj的副本,哪些是正确/推荐的?
选项A:
objCopy = [obj copyWithZone:zone];
选项B:
objCopy = [obj copy];
答案 0 :(得分:3)
如果您使用引用计数内存管理(而不是垃圾收集),则应使用[obj copyWithZone:zone]
。此外,您应该(在相同情况下)使用+allocWithZone:
而不是+alloc
来分配副本。这为指定内存区域中的实例分配内存(请参阅NSZone)。如果开发人员要分配许多对象,则可能会使用单独的区域,而这些对象几乎不会在同一时间再次需要。然后可以使用NSRecylceZone
在一个操作中回收整个区域,从而有助于防止内存碎片。通常,不需要使用私有区域(并且通常会损害性能;对代码进行概要分析!)。假设开发人员想要在特定区域中复制一份,我想您会认为他们希望所有相关实例都在同一区域。
-copy
和+alloc
方法分别调用-copyWithZone:
和+allocWithZone:
方法,并传递默认区域。