Gau*_*ing 55 iphone garbage-collection ios automatic-ref-counting
通过Xcode 4.2中引入的新自动引用计数(ARC),我们不再需要在Objective-C中手动管理保留/释放.
这看起来类似于垃圾收集,就像Mac上的Objective-C和其他语言一样.ARC如何与垃圾收集不同?
Bra*_*son 65
正如我在这里的回答中所描述的那样,ARC可以提供手动内存管理和跟踪垃圾收集的最佳功能.它主要消除了开发人员跟踪Objective-C对象上的手动保留,发布和自动释放的需要,同时避免了垃圾收集器进程的需要,这可能会占用移动设备上的有限资源并导致正在运行的应用程序中出现断断续续的异常情况.
ARC通过应用所有Objective-C开发人员多年来不得不使用的规则,在编译时插入引用计数所需的相应保留和释放.这使开发人员不必自己管理它.因为在编译时插入了保留和释放,所以不需要收集器进程来连续扫描内存并删除未引用的对象.
跟踪垃圾收集优于ARC的一个小优点是ARC 不会为您处理保留周期,其中跟踪垃圾收集可以选择这些.
关于这个主题的精彩读物来自Apple的Objective-C邮件列表中的这个主题,其中Chris Lattner这样说:
GC相对于ARC的主要优点是它可以收集保留周期.第二个优点是"保留"分配是"原子的",因为它们是一个简单的存储.ARC比libauto GC有几大优势:
- 它具有确定性的对象回收(当对象的最后一个强引用消失时),GC在某个时间"释放"对象.这定义了一类可能存在于未暴露的GC应用程序中的细微错误,因为收集器不会在"错误窗口"中触发.
- ARC的高水位标记通常远低于GC,因为物体会更快释放.
- libauto提供了一个脆弱的编程模型,你必须小心不要丢失写入障碍等.
- 并非所有的系统框架都是GC干净的,并且框架在它们发展时偶尔会回归.
- ARC不会遭受假根.libauto保守地扫描堆栈,这意味着看起来像指针的整数可以根对象图.
- ARC没有任何内容可以启动和停止你的应用程序,导致UI口吃.就GC实现而言,libauto非常先进,因为它不会立即停止每个线程,但它通常最终会停止所有UI线程.
我目前正在将手动内存管理项目以及使用Objective-C垃圾回收的项目迁移到ARC.在一些Mac应用程序中使用垃圾收集一段时间之后,我发现将这些项目移动到ARC有一些显着的优势.
Mes*_*ery 13
ARC依赖于编译时"引用"对象,这使得它在低功耗模式环境(移动设备)中有效.
GC依赖于基于运行时的"可到达"对象,这使得它在多线程环境中变得高效.
ARC将代码注入可执行文件,以便根据其引用计数"自动"在未使用的对象上执行.
GC在运行时工作,因为它将检测未使用的对象图(将消除保留周期)并在不确定的时间间隔内删除它们
ARC如何与垃圾收集不同?
ARC是垃圾收集的一种形式.
您可能意味着"ARC和跟踪垃圾收集(如JVM和.NET)之间有什么区别?".主要区别在于ARC较慢且泄漏周期.这就是JVM和.NET都使用跟踪垃圾收集器的原因.有关更多信息,请参阅如何比较引用计数和跟踪垃圾收集?.
| 归档时间: |
|
| 查看次数: |
22592 次 |
| 最近记录: |