【问题标题】:Does ARC set its reference type instance properties to nil before deallocation?ARC 是否在释放前将其引用类型实例属性设置为 nil?
【发布时间】:2016-05-06 07:44:28
【问题描述】:

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

我的问题是参考下图:

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

因此,将unit14A 设置为nil 只会删除对Apartment 实例的一个强引用,并且不应将其释放,因为由于上述情况,还会有一个强引用。

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

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

谁能帮我理解这个?

【问题讨论】:

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


【解决方案1】:

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

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

myStrongRef = nil;

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

[myStrongRef release];
myStrongRef = nil;

对我而言,[Apartment 的解除分配] 只有在 Person 实例解除分配时将其公寓属性设置为nil,通过删除Apartment 实例上的强引用才能发生。

设置对nil 的强引用是破坏强引用的一种方法。这已经足够了,但不是必须的。设置对nil 的强引用的重要之处不是设置本身,而是在它之前发生的事情:强引用引用的实例收到release 消息,指示它减少其引用计数。这正是 ARC 在幕后为您所做的:它将release 消息发送到Apartment,而不设置Personnil 的引用。

Apartment 实例如何被释放? Person 实例公寓属性的强引用发生了什么?

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      所有详细信息都可以在Clang documentation中找到。

      HTH

      【讨论】:

        【解决方案4】:

        显然不是在释放之前,而是在释放期间。

        当对象的引用计数变为零时,释放过程开始。该对象被标记为“被释放”。到那时,对象死掉(不像Java,它可以被恢复)。如果一个对象被这样标记,它不能被分配给弱引用(它们保持为 nil)或强引用。

        然后调用dealloc,也就是你写的dealloc方法。之后,将强引用设置为 nil,减少它们的引用计数,然后删除关联的对象,最后删除对象的内存。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-01
          • 1970-01-01
          • 2013-04-27
          • 1970-01-01
          相关资源
          最近更新 更多