iPhone: (id)copyWithZone:(NSZone *)zone:什么是“zone”?

16
当在类中实现 NSCopying 方法以启用拷贝时,参数 zone 有什么作用? 如果我设置一个新对象,我不需要使用 allocWithZone 进行分配,只需要使用 alloc 就足够了... 我感到困惑...
2个回答

25

这是一个遗留下来的东西,早期我们有多个“区域”可供分配。如今,所有应用都只有一个区域来进行分配,但是NSZone类仍然存在,许多代码都依赖于+allocWithZone:作为基本分配方法进行编写,因此无法更改。

简而言之,您可以完全忽略NSZone结构体,唯一需要关注+allocWithZone:的原因是如果您需要覆盖它。同样,对于-copyWithZone:,您可以忽略区域。如果您愿意,可以调用+allocWithZone:并传入相同的区域,但不会有任何区别。


1

7
我个人认为,该文档没有以任何有用的方式解释它是什么:"一个用于为新实例分配内存的区域"至多也只是含糊不清的描述。 - Matthew Frederick
这个问题没有被解释,因为它已经不再有用了。在早期,你经常有不同的内存区域或“区域”,你可以用来存储东西,而区域的使用就是为此而生的。现在,现代操作系统让你把所有东西都看作一个大池子,任何东西都可以访问。虽然从理论上讲,仍然有一些用途(例如安全映射内存空间、自定义内存映射文件等),但我不确定你甚至能否依赖区域仍然正常工作。 - Shayne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接