当一个对象被分配给另一个对象时会发生啥?
Posted
技术标签:
【中文标题】当一个对象被分配给另一个对象时会发生啥?【英文标题】:What happens when a object is assigned to another object?当一个对象被分配给另一个对象时会发生什么? 【发布时间】:2013-12-09 13:30:55 【问题描述】:例如:
myVC.bunnies = self.myBunnies;
或
[self getBunniesWithCompletion:^(NSArray *bunnies)
self.myBunnies = bunnies;
];
是对象被复制了,还是只是它的引用被复制了,如果它被破坏,一切都会破坏?
属性声明如下:
@property (strong, nonatomic) NSArray *myBunnies;
【问题讨论】:
属性如何声明? NSArray *bunnies = [NSArray new]; 不,物业。self.myBunnies
.
@property (strong, nonatomic) NSArray *myBunnies;
看到这个***.com/a/9860283/716216
【参考方案1】:
当您执行此分配时,将复制一个引用,并增加一个引用计数。所有这些都是通过 ARC 隐式完成的,因为您声明了您的属性 strong
。
如果您想制作副本,请将声明更改为
@property (copy, nonatomic) NSArray *myBunnies
这会更昂贵,但对象内部的数组将与传递给 setter 的数组隔离。
【讨论】:
所以在引用计数为 0 之前引用不会被销毁? @Devfly 正确,在引用计数降为零之前,对象不会被销毁。【参考方案2】:这完全取决于你声明属性的方式:
@property(strong)
:对象引用计数增加,这意味着对象self
保持对受影响对象的引用,因此该对象不会被释放(直到通过将其设置为nil
释放引用)
@propery(weak)
:对象引用被简单地赋值,但引用计数没有增加,这意味着self
不保留对它的引用
@property(copy)
:对象被复制(使用<NSCopying>
的copy
方法),因此存储了一个新实例,独立于第一个实例
我强烈建议您阅读 Apple Doc 中的高级内存管理编程指南。它并不完全是最新的,因为文档的某些部分仍然描述了在 ARC 成为标准之前它的工作方式,但阅读以了解这些机制仍然很有趣。
【讨论】:
以上是关于当一个对象被分配给另一个对象时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章
在将一个对象分配给另一个对象时,实际发生了啥,保留对象还是整个副本?