ARC和MRC的区别

10

我对苹果材料感到困惑。

我们有三种方式来管理内存,它们是:

  1. 自动引用计数。
  2. 手动引用计数。
  3. 垃圾回收。

我的疑问是自动引用计数和手动引用计数之间有什么区别。

有人能给我解释一下吗?


可能是新的自动引用计数机制如何工作?的重复问题。 - Brad Larson
4个回答

16

在ARC中,你不需要释放/自动释放你分配的内存,而在手动管理内存的情况下,你必须注意这一点。 例如,手动管理内存的情况:


在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
}

好的。谢谢您。它们之间有什么区别吗? - user1157838
1
@user1157838:是的,请注意在ARC情况下没有[arr release];。另外请注意,在iOS上垃圾回收不可用。 - Bogatyr
有没有使用ARC的设置? - user1157838
4
可以前往项目设置 ->> Objective C自动引用计数,你可以在那里选择是或否。 - Inder Kumar Rathore
但是Ankit说这只在SDK 4.2及以上版本中可用。 - user1157838
是的,它在SDK 4.2中可用。 - Inder Kumar Rathore

4

在ARC中,操作系统会负责内存管理,因此您不必担心释放对象。这对于初学者来说非常方便。而在手动计数中,您将不得不跟踪释放内存,如果做得不正确,您的应用程序将崩溃。ARC和MRC适用于iOS,而垃圾收集仅限于MAC-OSX。希望这有所帮助。Inder提供了一个很好的例子。


任何版本都支持ARC吗? - user1157838
从 SDK 4.2 开始,您的意思是不需要释放对象了。我们可以创建任意数量的对象。我说得对吗? - user1157838
1
是的,但是当您创建新项目时,您将需要启用ARC,否则它将作为MRC工作。 - Ankit Srivastava

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/


0

MRC vs ARC

ARC编译时自动插入retainreleaseautorelease,而不是由开发人员手动管理内存。现在您不必担心手动内存管理的问题。

[底层原理]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接