在NSCopyObject
的Xcode文档中,特殊注意事项部分指出:
此功能很危险,很难正确使用。任何可以被子类化的类都可以将它作为
copyWithZone:
的一部分使用,非常容易出错。在GC下或使用Objective-C 2.0时,完全忽略该区域。在Mac OS X 10.6之后,可能不推荐使用此功能。
为什么难以正确使用?它执行浅(逐位)复制。不复制或保留对象。文档非常明确。
如果我没有遗漏其他原因,那么执行对象浅层副本的首选方法是什么?
修改
有正当理由要执行浅拷贝。一个例子:一个类可能有许多实例变量,其中大多数是基本类型(整数,浮点数)或有意不保留的对象以避免保留周期(委托)。使用NSCopyObject
的浅拷贝在一个漂亮的,自我记录的代码行中复制所有这些。任何需要参考计数的剩余ivars都可以单独保留或复制。
替代方法是使用指针语法(newObject->ivar = ivar
)分配新对象,或创建具有潜在大量参数的init方法(每个ivar一个用于复制)。后者让我觉得特别难看,但我想它不需要在标题中并暴露给世界。
答案 0 :(得分:2)
也许你会发现这篇文章很有用:
http://robnapier.net/blog/implementing-nscopying-439
答案 1 :(得分:1)
您不应该制作一份不涉及正确保留/释放的浅层副本。周期。