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

Sar*_*ran 3 iphone objective-c ios automatic-ref-counting swift

在阅读本文时,我遇到了这个问题.

我的问题是参考下图:

在此输入图像描述

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

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

但是,正如文件所说,Apartment实例很快就被解除了分配.对我来说,这只有在Person实例解除分配时才会将其公寓属性设置为nil,通过删除Apartment实例上的强引用.但我找不到任何文件来验证这一点.

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

有人能帮助我理解这个吗?

das*_*ght 5

Objective-C对象是引用计数的,这意味着对于每个对象,系统会跟踪有多少其他对象持有对它的引用.这是对象的引用计数.两个特殊的消息,retain并且release,用于维持幕后的引用计数.一旦引用计数降至零,系统就会释​​放该对象.

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

myStrongRef = nil;
Run Code Online (Sandbox Code Playgroud)

编译器release在作业前面静静地插入一个调用:

[myStrongRef release];
myStrongRef = nil;
Run Code Online (Sandbox Code Playgroud)

对我来说[释放Apartment]只有在Person实例解除分配时才会将其公寓属性设置为nil,通过删除Apartment实例上的强引用.

强烈建议nil打破强引用的一种方式.这已经足够了,但没有必要.设置强引用的重要之nil处不在于设置自身,而是在它之前发生的事情:强引用引用的实例获取一条release消息,指示它减少其引用计数.这正是ARC在幕后为你做的事情:它将release消息发送给Apartment,而不设置Person引用nil.

Apartment实例如何解除分配?Person实例公寓财产的强烈参考怎么了?

一旦强烈的引用Person发送了它的release消息Apartment,那个强引用就会消失.实际的指针可能被设置为Apartment的地址,但没有人关心它,因为它Person本身是无法访问的.