我在阅读 this 时想到了这个问题.
我的问题引用下图:
一旦 john 设置为 nil,Person
实例将不再具有任何强引用,因此将被释放。但是 Apartment
有两个强引用,其中一个是 Person
实例上的属性,该实例很快就会被释放。我相信,这个强引用在解除分配后会继续保留,并且代码无法访问。
因此,将 unit14A
设置为 nil
只会删除对 Apartment
实例的一个强引用,它不应被释放,因为本来会有一个由于上述案例,更具引用性。
但是,正如文档所说,Apartment
实例很快就被释放了。对我来说,这只有在 Person
实例释放时才会发生,它通过删除强引用将其 apartment 属性设置为 nil
在 Apartment
实例上。但是我找不到任何文档来验证这一点。
那么,Apartment 实例是如何被释放的呢?来自 Person 实例公寓属性的强引用发生了什么?
谁能帮我理解一下?
最佳答案
Objective-C 对象是引用计数的,这意味着对于每个对象,系统会跟踪有多少其他对象持有对它的引用。这是对象的引用计数。 retain
和 release
这两个特殊消息用于在后台维护引用计数。一旦引用计数降为零,系统就会释放该对象。
ARC 提供了“魔法”,使引用计数以声明的方式工作。编译器知道你代码中的每一个强引用,所以当你这样做的时候
myStrongRef = nil;
编译器悄悄地在赋值前插入对release
的调用:
[myStrongRef release];
myStrongRef = nil;
To me [deallocation of
Apartment
] can only happen if at the time ofPerson
instance deallocation it sets its apartment property tonil
, by that removing that strong reference onApartment
instance.
设置对nil
的强引用是打破强引用的一种方式。这是足够的,但不是必需的。设置对 nil
的强引用的重要之处不是设置自身的行为,而是紧接在它之前发生的事情:强引用引用的实例获得 release
消息,指示它减少其引用计数。这正是 ARC 在幕后为您所做的:它将 release
消息发送到 Apartment
,而不设置 Person
对 的引用>无
。
How does the
Apartment
instance get deallocated? What happened to the strong reference from thePerson
instance apartment property?
一旦来自Person
的强引用将其release
消息发送到Apartment
,该强引用就会消失。实际指针可能设置为 Apartment
的地址,但没有人关心它,因为 Person
本身是不可访问的。
关于ios - ARC 在解除分配之前是否将其引用类型实例属性设置为 nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35069855/