NSCopyObject被认为有害吗?

时间:2010-08-10 16:52:53

标签: objective-c nscopying

NSCopyObject的Xcode文档中,特殊注意事项部分指出:

  

此功能很危险,很难正确使用。任何可以被子类化的类都可以将它作为copyWithZone:的一部分使用,非常容易出错。在GC下或使用Objective-C 2.0时,完全忽略该区域。

     

在Mac OS X 10.6之后,可能不推荐使用此功能。

为什么难以正确使用?它执行浅(逐位)复制。不复制或保留对象。文档非常明确。

如果我没有遗漏其他原因,那么执行对象浅层副本的首选方法是什么?

修改

有正当理由要执行浅拷贝。一个例子:一个类可能有许多实例变量,其中大多数是基本类型(整数,浮点数)或有意不保留的对象以避免保留周期(委托)。使用NSCopyObject的浅拷贝在一个漂亮的,自我记录的代码行中复制所有这些。任何需要参考计数的剩余ivars都可以单独保留或复制。

替代方法是使用指针语法(newObject->ivar = ivar)分配新对象,或创建具有潜在大量参数的init方法(每个ivar一个用于复制)。后者让我觉得特别难看,但我想它不需要在标题中并暴露给世界。

2 个答案:

答案 0 :(得分:2)

也许你会发现这篇文章很有用:
http://robnapier.net/blog/implementing-nscopying-439

答案 1 :(得分:1)

您不应该制作一份不涉及正确保留/释放的浅层副本。周期。