在重新分配之前,ARC是否将其引用类型实例属性设置为nil?

时间:2016-01-28 19:04:42

标签: ios objective-c iphone swift automatic-ref-counting

在阅读this时,我遇到了这个问题。

我的问题是参考下图:

enter image description here

一旦john设置为nil,Person实例不再具有更强的引用,因此将被释放。但Apartment有两个强引用,其中一个是Person实例上的属性,很快就会被释放。我相信,这个强大的参考资料在重新分配后仍然存在,并且代码无法实现。

因此,将unit14A设置为nil只会删除对Apartment个实例的一个强引用,并且不应该取消分配,因为由于上述情况会有一个更强的引用。

但是,正如文件所说,Apartment实例已迅速解除分配。对我来说,只有在Person实例解除分配时,它才会将公寓属性设置为nil,这样才能删除Apartment上的强引用实例。但我找不到任何证明这一点的文件。

那么,Apartment实例如何解除分配?来自Person实例公寓属性的强引用发生了什么?

有人可以帮助我理解这个吗?

4 个答案:

答案 0 :(得分:5)

Objective-C对象是引用计数的,这意味着对于每个对象,系统会跟踪有多少其他对象持有对它的引用。这是对象的引用计数。两条特殊消息retainrelease用于维护场景后面的引用计数。一旦引用计数降至零,系统就会释​​放该对象。

ARC提供"魔法"以声明的方式进行引用计数工作。编译器知道代码中的每个强引用,所以当你这样做时

myStrongRef = nil;

编译器在作业前悄悄地插入对release的调用:

[myStrongRef release];
myStrongRef = nil;
  

对我来说[释放Apartment]只有在Person实例解除分配时才将其公寓属性设置为nil,这样才能删除Apartment上的强引用1}}实例。

设置对nil强烈引用的一种打破强引用的方法。这已经足够了,但这并不是必需的。设置对nil的强引用的重要之处不在于设置自身,而是在它之前发生的事情:强引用引用的实例获取release消息,指示它递减它的参考数量。这正是ARC在幕后为您做的事情:它将release消息发送到Apartment,而不设置Personnil的引用。

  

Apartment实例如何解除分配? Person实例公寓属性的强引用发生了什么变化?

一旦Person的强引用将release消息发送至Apartment,该强引用就会消失。实际指针可能设置为Apartment的地址,但没有人关心它,因为Person本身无法访问。

答案 1 :(得分:2)

对象的生命取决于它的引用计数,而不是指向对象的任何实际指针。

强引用是一种说法,强引用和弱引用之间没有区别,它们只是指针。不同之处在于,当创建强引用时,指向的对象的引用计数递增,并且当删除时引用计数减少。当一个对象的引用计数变为零时,该对象将被释放。

答案 2 :(得分:1)

你的直觉是正确的。当一个对象在ARC下被释放时,它所拥有的所有强引用首先被放弃 - 实际上它们被设置为nil,但实际上实现可能会有所不同。

这也是当方法返回时发生的事情,或者包含声明的代码块退出时,放弃了局部变量中保存的所有强引用。

所有细节都可以在Clang documentation

中找到

HTH

答案 3 :(得分:0)

在解除分配之前显然不是,而是在解除分配期间。

当对象的引用计数变为零时,将重新分配进程。该对象标记为“正被解除分配”。此时,对象死掉(与Java不同,可以恢复它)。如果对象标记为这样,则不能将其分配给弱引用(它们保持为零)或强引用。

然后调用dealloc,即你编写的dealloc方法。之后,强引用设置为nil,减少其引用计数,然后删除关联的对象,最后删除对象的内存。