将对象分配给另一个对象时会发生什么?

时间:2013-12-09 13:30:56

标签: ios objective-c cocoa-touch

例如:

myVC.bunnies = self.myBunnies;

[self getBunniesWithCompletion:^(NSArray *bunnies) {
     self.myBunnies = bunnies;
}];

是否复制了对象,或者它只是被复制的引用,如果它被破坏,一切都会被破坏?

该属性声明如下:

@property (strong, nonatomic) NSArray *myBunnies;

2 个答案:

答案 0 :(得分:2)

执行此分配时,将复制引用,并增加引用计数。所有这些都是通过ARC隐式完成的,因为您声明了属性strong

如果您想要制作副本,请将声明更改为

@property (copy, nonatomic) NSArray *myBunnies

这会更昂贵,但是对象中的数组将与传递给setter的数组隔离。

答案 1 :(得分:1)

这完全取决于你宣布财产的方式:

  • @property(strong):对象引用计数增加,这意味着对象self保留对受影响对象的引用,以便不释放此对象(直到通过将其设置为已释放引用为止) nil
  • @propery(weak):简单地指定了对象引用,但未增加引用计数,这意味着self不会保留对它的引用
  • @property(copy):对象被复制(使用<NSCopying>的{​​{1}}方法),因此存储了一个新实例,与第一个实例无关

我强烈建议您阅读Apple Doc中的“高级内存管理编程指南”。它并不完全是最新的,因为在ARC成为标准之前,文档的某些部分仍然描述了它的工作方式,但阅读理解这些机制仍然总是很有趣。