Cocoa 我可以使用同一个NSZone两次吗?

Cocoa 我可以使用同一个NSZone两次吗?,cocoa,memory-management,Cocoa,Memory Management,第一次尝试实施NSCOPY,我对NSZone的转租有一个问题: - (id)copyWithZone:(NSZone *)zone { MyClass *copy = [[[self class] allocWithZone:zone] init]; copy.array = [[self.array mutableCopyWithZone:zone] autorelease]; return copy; } 在本例中,我将使用NSZone两次:首先分配对象,然后再

第一次尝试实施NSCOPY,我对NSZone的转租有一个问题:

- (id)copyWithZone:(NSZone *)zone {
    MyClass *copy = [[[self class] allocWithZone:zone] init];

    copy.array = [[self.array mutableCopyWithZone:zone] autorelease];

    return copy;
}
在本例中,我将使用NSZone两次:首先分配对象,然后再次分配数组的副本。这合法吗?有必要吗?我可以简单地执行mutableCopy,我还考虑使用-initWithArray:copyItems:作为一种可能的替代方法


最好的办法是什么?在“我需要生成的数组的对象是浅拷贝还是深拷贝?”这个问题上,请随意选择任何一种方式。对我来说,关键是两次使用NSZone是否安全。

从同一个分区创建多个对象正是创建分区的目的。其想法是,您可以创建一个分区,并从该分区创建一个或多个对象(他们可能会创建任何相关对象),然后您可以销毁该分区,从而销毁其中的所有对象

问题是,这与引用计数的概念,即所有权,是相当不相容的。如果你吹走了一个区域,其中包含一个或多个仍然拥有的对象(即,期望仍然能够使用),那么事情就会破裂。如果在您销毁该区域时,所有这些对象的所有者都已释放,则它们已一次释放一个,因此该区域不会完成任何操作,因此是不必要的


因此,尽管出于风格一致性的考虑,您可能仍然更愿意按照现在的方式进行操作,但这不会对运行时发生的事情产生任何显著影响。

您好,毫无疑问您是正确的,谢谢。你能详细说明一下这是如何影响复制的吗?我现在比以前更糊涂了。遵守NSCopying的原因是您可以说[aDictionary setObject:x forKey:myNSCopyingObject]。您对NSZone所说的话使人对如何正确遵守协议产生了疑问。显然,我只是从苹果模板开始,他们显然没有更新它。@SG1:复制和创建原始对象是一样的。您可以至少名义上使用区域(因为区域不再真正做任何事情),也可以假装区域不存在,只在实现中使用
alloc
/
copy
/
mutableCopy
。你的选择。