当一个对象被分配给另一个对象时会发生啥?

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 成为标准之前它的工作方式,但阅读以了解这些机制仍然很有趣。

【讨论】:

以上是关于当一个对象被分配给另一个对象时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

在将一个对象分配给另一个对象时,实际发生了啥,保留对象还是整个副本?

当事件触发并尝试在不再存在的对象中执行事件处理程序时会发生啥?

当删除没有虚拟析构函数的多态对象时会发生啥?

当返回对象的函数在没有返回语句的情况下结束时会发生啥

当 setState 与类的对象实例发生反应时会发生啥

当我们在 JavaScript 中将原语视为对象时会发生啥?