【问题标题】:Memory Management in ARCARC 中的内存管理
【发布时间】:2012-12-05 11:36:13
【问题描述】:

我无法理解对象是如何在 ARC 中释放的,对此我仍然感到困惑。

假设我在方法中使用 alloc 创建了一个视图控制器或任何其他方法

    -(void) displayView
    {
       RegViewController *sampleView = [[RegViewController alloc] init];
       [sampleView setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
       [sampleView setModalPresentationStyle:UIModalPresentationFormSheet];
       [self presentModalViewController:sampleView animated:YES];
    }

它是释放方法块完成时创建的对象,还是我们应该通过给 nil 引用来显式释放?

【问题讨论】:

  • 使用 ARC 时,当对象超出范围(不再需要)时,编译器将包括对 release 方法的必要调用,开始时 ARC 的发布没有区别和一个非 ARC 应用程序。
  • 是的,范围是 ARC 的唯一关注点。

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


【解决方案1】:

在这种情况下,sampleView 将在模态视图被关闭时释放。在这种情况下,不需要做任何其他事情。

【讨论】:

    【解决方案2】:

    ARC 代表自动引用计数。 它接管了用户维护对象引用计数的责任。 这就是你不能再打电话给[obj retain][obj release] 的原因。 一旦引用计数器达到 0,它就会为您释放它。 请记住,它不是垃圾收集器。在某些情况下,如果您不小心,这种机制可能会导致内存泄漏。但总的来说效果很好。

    【讨论】:

      【解决方案3】:

      视图控制器在块结束时自动释放。然而,这意味着它已被解除分配 - 它仍由 presentModalViewController:animated: 方法保留,并且在解除时将被释放(并解除分配)。

      【讨论】:

      • 很好发现,但在解雇时它应该消失。
      • 如果我们关闭视图控制器,那么它会被释放吗?
      • 请记住,所有对对象的强引用都必须无效,ARC 才能释放它。在这种情况下,dismiss 方法应该使某些变量无效以释放它。
      【解决方案4】:
      Does it release the object created when the method block completes or we should explicitly release by giving nil to reference?
      

      答案是

      在上述情况下,sampleView 保留计数未达到 0,因为您将其作为参数传递给 self 类。一旦所有强引用都被清除,它的保留计数将下降到 0,只有在那之后它才会被释放。

      您可以简单地将您的代码想象为RegViewController *sampleView = [[[RegViewController alloc] init] autorelease];

      【讨论】:

        猜你喜欢
        • 2013-01-17
        • 1970-01-01
        • 2011-11-14
        • 2013-10-03
        • 2013-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-27
        相关资源
        最近更新 更多