在Xcode文档中
NSCopyObject
特别注意事项一节指出:
此功能很危险,很难正确使用。它被用作
copyWithZone:
任何可以被子类化的类,都是非常容易出错的。在GC或使用Objective-C2.0时,区域完全被忽略。
在Mac OS X 10.6之后,此函数可能会被弃用。
为什么很难正确使用?它执行浅(逐位)复制。不会复制或保留对象。文件对此非常清楚。
如果我没有遗漏其他原因,执行对象的浅层复制的首选方案是什么?
有充分的理由希望执行浅层复制。一个例子:一个类可能有许多实例变量,其中大多数是原语类型(integer、float)或故意不保留以避免保留循环的对象(委托)。使用
将所有这些复制到一行很好的、自文档化的代码中。任何需要引用计数的剩余ivar都可以单独保留或复制。
另一种方法是使用指针语法为新对象赋值(
newObject->ivar = ivar
)或者创建一个具有大量参数的init方法(每个ivar复制一个参数)。后者给我的印象特别难看,但我想它不需要在头球和暴露在世界上。