我可以两次使用相同的NSZone吗?

时间:2012-02-20 00:39:17

标签: cocoa memory-management

第一次尝试实施NSCopying,我对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是否安全。

1 个答案:

答案 0 :(得分:4)

从同一区域创建多个对象正是为其发明的区域。我们的想法是你可以创建一个区域,并从该区域创建一个或多个对象(并且它们可能会创建任何相关对象),然后你可以销毁该区域,从而销毁其中的所有对象。

问题在于,这与引用计数的概念(即所有权)相当不相容。如果你吹掉一个包含一个或多个物品但仍然拥有的物品的区域(即,仍然可以使用),事情就会破裂。如果所有这些对象在您销毁区域时已被所有所有者释放,则它们已经一次被释放,因此该区域不会完成任何操作,因此没有必要。

因此,zones have been killed off,所以虽然你可能仍然喜欢按照风格一致性的方式这样做,但它不会对运行时发生的事情产生任何重大影响。

相关问题