【问题标题】:Confusion in memory management in Objective-C?Objective-C中内存管理的困惑?
【发布时间】:2016-09-12 15:24:15
【问题描述】:

我阅读了有关 Objective-C 中手动和 ARC 内存管理的信息。在以下几点中,我对 Objective-C 中的内存管理哪个是正确的感到困惑?

  • 在 ARC 和手动内存下的 dealloc 中始终为 nil out 属性 管理。

  • 不必在 ARC 和手动下清空 dealloc 中的属性 内存管理。

  • 在 ARC 下的 dealloc 中没有属性,但在手动内存中没有 管理。

  • 在手动内存管理下,dealloc 中的属性为零,但 不在 ARC 中。

【问题讨论】:

  • 如果您觉得您的问题已经得到解答,请接受其中一个答案
  • 其实,把你所有的问题都回过一遍,看看有没有答案可以接受。您不接受对您的任何问题的任何回答。见What should I do when someone answers my question?

标签: objective-c memory-management automatic-ref-counting


【解决方案1】:

只需使用 ARC 和快乐的日子!

但是,您至少应该知道strong and weak references 之间的区别。

【讨论】:

    【解决方案2】:

    在大多数情况下,没有太多理由使用手动内存管理了。

    但要回答您的问题,请不要在 dealloc 中使用 nil。而是:

    1. 使用 ARC 对 dealloc 中的属性不执行任何操作。
    2. 在手动管理的 dealloc 中释放强持有的属性。 [myObject release];

    【讨论】:

      【解决方案3】:

      您永远不必“消除”属性,您只需在手动管理内存时释放它们。

      当您将值设置为 nil 时,您会忘记那里的旧值。那个旧值存储了对象的地址。现在该对象继续存在,但您不再知道它的地址,也无法释放它。

      Release 告诉一个对象“我不再使用你,如果我是最后一个,那么删除你自己”。在 ARC 中,保留和释放调用由编译器自动添加。很少有理由再自己进行手动内存管理了。 ARC 是要走的路。

      【讨论】:

      • 当你设置一个值为nil时,ARC会释放这个对象。
      • 他专门说的是dealloc。假设我有一个变量foo 指向一个对象。将其设置为nil 将导致编译器添加release 调用。但这发生在dealloc 方法中,foo 存储的对象本身即将被销毁。这将减少引用计数。不需要nil它。
      • 正如我的回答所说:“您永远不必“消除”属性,”
      • 显然,“你永远不必'nil'出属性”这个明确的说法太宽泛了。此声明仅适用于对象自身在其dealloc 方法上下文中的属性。但是在dealloc 中,您经常nil 任何weakunsafe_unretained 对被释放对象的引用(例如,常见于委托、通知、KVO 等)。同样,在dealloc 的上下文之外,您一直在使用nil 属性。但是你的观点很好,在dealloc 中,你不必nil 对象自己的任何属性(但在MRC 中你必须release 它们)。
      • 是的,我的陈述将在问题的背景下进行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 2020-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多