ios - ARC 在解除分配之前是否将其引用类型实例属性设置为 nil?

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

我在阅读 this 时想到了这个问题.

我的问题引用下图:

enter image description here

一旦 john 设置为 nil,Person 实例将不再具有任何强引用,因此将被释放。但是 Apartment 有两个强引用,其中一个是 Person 实例上的属性,该实例很快就会被释放。我相信,这个强引用在解除分配后会继续保留,并且代码无法访问。

因此,将 unit14A 设置为 nil 只会删除对 Apartment 实例的一个强引用,它不应被释放,因为本来会有一个由于上述案例,更具引用性。

但是,正如文档所说,Apartment 实例很快就被释放了。对我来说,这只有在 Person 实例释放时才会发生,它通过删除强引用将其 apartment 属性设置为 nilApartment 实例上。但是我找不到任何文档来验证这一点。

那么,Apartment 实例是如何被释放的呢?来自 Person 实例公寓属性的强引用发生了什么?

谁能帮我理解一下?

最佳答案

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

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

myStrongRef = nil;

编译器悄悄地在赋值前插入对release的调用:

[myStrongRef release];
myStrongRef = nil;

To me [deallocation of Apartment] can only happen if at the time of Person instance deallocation it sets its apartment property to nil, by that removing that strong reference on Apartment instance.

设置对nil 的强引用是打破强引用的一种方式。这是足够的,但不是必需的。设置对 nil 的强引用的重要之处不是设置自身的行为,而是紧接在它之前发生的事情:强引用引用的实例获得 release消息,指示它减少其引用计数。这正是 ARC 在幕后为您所做的:它将 release 消息发送到 Apartment,而不设置 Person 的引用>无

How does the Apartment instance get deallocated? What happened to the strong reference from the Person instance apartment property?

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

关于ios - ARC 在解除分配之前是否将其引用类型实例属性设置为 nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35069855/

相关文章:

ios - 如何在 UICollectionView 中隐藏一个部分

ios - 用不同类型的兼容类覆盖@IBoutlet 属性

c++ - 在 Objective-C++ 中使用 C++ 类

iphone - 显示按日期对核心数据进行排序

iphone - 在 iOS 应用程序中对 Sqlite 的写访问

iOS通讯录导入API : Any special handling needed for iCloud entries?

ios - 在快速编程语言中隐藏文本字段的键盘

objective-c - 添加的按钮未显示在 UINavigationController 上

ios - 在相机 OverlayView 中绘制图像

iphone - iPhone 是否可以同时播放声音并通过麦克风录音?