@property(复制) - 是完整的副本吗?

时间:2009-04-11 05:40:08

标签: objective-c

我正在使用此属性访问器获取CALayer的子层:

// @property(copy) NSArray *sublayers

NSArray* layer = mylayer.layer.sublayers;

由于此属性使用“copy”,因此每次执行时都会执行:

mylayer.layer.sublayers

是为我制作的子图层数组的完整副本吗?如果是这样可能会很糟糕,因为我可能有一百个+层,并且绝对不想创建它们的大量副本。我只是想要计算并迭代现有的图层,只是指向现有图层的指针

谢谢

2 个答案:

答案 0 :(得分:2)

当您使用'copy'声明并且@synthesize属性时,则在设置属性时使用copy。

在您的示例中,您只访问仅为您提供指向子图层数组的指针的值。

Here's a link关于这一点的ADC文档。

<强>更新

  1. IIRC,运行时足够聪明,可以知道所设置的对象是否可变。如果将不可变对象传递给属性,则将其保留而不进行复制。
  2. 在某些情况下,如果要传递一个您希望能够修改的可变对象,那么您应该编写自己的setter,在该对象上调用mutableCopy。这显示在我提供的documentation link中。

答案 1 :(得分:1)

我不确定我理解你的答案Abizern所以让我这样说:

如果你在一个属性上使用(复制),你将会制作该对象的全新副本,因此会浪费大量内存。我不确定他们为什么这样做,如果他们想要保护价值不变,他们可以只使用(只读)。另外请记住,大多数值类在Obj-C中是不可变的,所以它们无论如何也无法改变它。