ARC和MRC之间的区别

时间:2012-02-02 09:50:38

标签: iphone memory-management garbage-collection automatic-ref-counting

我对Apple材料感到困惑。

我们通过3种方式管理内存:

  1. 自动referance计数。
  2. 手动引用计数。
  3. 垃圾收集。
  4. 我怀疑自动引用计数和手动依据计数之间有什么区别。

    有人可以解释一下吗?

4 个答案:

答案 0 :(得分:14)

在ARC中,您不必释放/自动释放由您分配的内存,因为在手动情况下您必须处理此问题。 例如手册

-(void)someMethod
{ 
    NSMutableArray *arr = [[NSMutableArray alloc] init];
    //use array
    [arr release]; //when array is in no use
}

ARC案例

-(void)someMethod
{
    NSMutableArray *arr = [[NSMutableArray alloc] init];
    //use array
}

答案 1 :(得分:3)

在ARC中,操作系统负责内存管理,因此您不必担心释放对象。这对初学者来说非常简洁。在手动计数中,您必须跟踪释放内存,如果您没有正确操作,最终会导致应用程序崩溃。 ARC和MRC在ios中可用,因为垃圾收集仅限于MAC-OSX,希望这会有所帮助。 Inder给出了一个很好的例子。

答案 2 :(得分:0)

在MRC中,您负责跟踪并确保正确地增加,减小和释放对象的所有引用。在Obj-C中,您基本上有一组规则来帮助您避免出现任何内存泄漏或指针悬空的情况,并且付出了巨大的努力来确保一切工作正常,并且可以通过某些方法(例如某些方法)来自动化其他语言习惯。

这就是ARC进入游戏的时候。

ARC是MRC运作方式的重要替代方案。使用ARC时,在没有强引用的情况下会释放实例,并且每个实例都会跟踪保留给自己的强引用和弱引用/无人引用的数量。尽管它看起来像是类似的行为,但是在两种情况下使用的工作量差异很大,在MRC中,您必须跟踪所有情况,而在ARC中,唯一要做的就是避免保留周期。

ARC和垃圾收集器之间的一些区别是:

  • 垃圾收集器是运行时结构的一部分。在ARC中,Swift编译器在应用程序捆绑包中进行代码清理和参考跟踪插入。
  • 实例丢失引用后,垃圾收集器不会回收内存,而ARC会回收。
  • 如果某些对象循环(或图形)具有对自身的引用,但无法通过根节点访问,则GC可以清除孔图,而在ARC中,它们将永远不会被释放,因为它们持有对其他对象的强引用(保留周期)。

如果您想查看更多信息,我发现本文非常有帮助:https://swift007blog.wordpress.com/2017/01/14/what-is-arc-in-ios/

答案 3 :(得分:0)

MRC 与 ARC

ARC编译时插入 retainreleaseautorelease 而不是 developer。现在你不用担心手动内存管理

[Under the hood]