【问题标题】:Why is an object not automatically set to nil when its reference count becomes 0?为什么一个对象在引用计数变为 0 时不会自动设置为零?
【发布时间】:2014-05-14 00:34:07
【问题描述】:

在非 ARC Objective C 环境中,我理解为什么我们必须释放一个对象:释放分配给它的内存;我理解为什么我们必须在之后将其设置为 nil(如果我们确定没有其他东西需要该实例/没有其他东西仍然可以控制该对象):以避免悬空指针。

但是我的问题是,如果所有对象都释放对一个对象的持有,例如“carInstance”,导致它的引用计数下降到 0,为什么哦,为什么这不会自动使其为零?

如果引用计数现在为 0,那么该对象是否仍然可以以任何方式使用?或者这只是我们必须做的事情之一,因为这就是没有垃圾收集的方式(不可能,一定有原因)

【问题讨论】:

  • pnizzle 询问非 ARC 环境。
  • @SeamusCampbell 哎呀,完全误读了!
  • 你希望它神奇地成为nil?
  • 因为它很难(编译器实现)而且速度很慢
  • 指针与对象的关系是“单向”。该对象不知道是谁在指向它。指向同一个对象的不同指针也不知道彼此。您想要的行为就是创建 ARC 的原因。

标签: ios automatic-ref-counting release reference-counting


【解决方案1】:

简单的答案是在 ARC 之前使用的手动内存管理模型是轻量级和简单的。您希望的行为是您在 ARC 下使用 weak 指针获得的行为;并且它需要操作系统进行额外的工作,以跟踪弱指针并在对象被回收时将它们清零。显然,这是可行的,但在 Apple 已经推出实施 ARC 的额外工作之前,实施它的成本以及计算开销被认为是不值得的。

在一个对象被释放后,悬空指针比无用的更糟糕:它是彻头彻尾的危险。当它指向未分配的内存时引用它会产生异常;在它被随机重新分配给另一个对象或其他一些内存分配之后引用它通常会产生“对象不响应选择器”错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 2014-07-31
    相关资源
    最近更新 更多