Iphone iOS 5有垃圾收集吗?

Iphone iOS 5有垃圾收集吗?,iphone,objective-c,ios,ios5,Iphone,Objective C,Ios,Ios5,我是否不再需要担心iOS 5以后的内存管理?此外,是否所有为iOS 4和更早版本编写的程序都必须重写,以允许iOS为您管理内存 在苹果上,他们说: 自动参考计数 Objective-C的自动引用计数(ARC)使内存管理成为编译器的工作。通过使用新的Apple LLVM编译器启用ARC,您将不再需要再次键入retain或release,从而大大简化了开发过程,同时减少了崩溃和内存泄漏。编译器完全了解您的对象,并在不再使用每个对象时立即将其释放,因此应用程序运行速度一如既往,性能可预测且平稳 这是一

我是否不再需要担心iOS 5以后的内存管理?此外,是否所有为iOS 4和更早版本编写的程序都必须重写,以允许iOS为您管理内存

在苹果上,他们说:

自动参考计数

Objective-C的自动引用计数(ARC)使内存管理成为编译器的工作。通过使用新的Apple LLVM编译器启用ARC,您将不再需要再次键入retain或release,从而大大简化了开发过程,同时减少了崩溃和内存泄漏。编译器完全了解您的对象,并在不再使用每个对象时立即将其释放,因此应用程序运行速度一如既往,性能可预测且平稳

这是一个编译器特性;不是一个操作系统功能,所以我不明白为什么它不能与旧版本一起工作

自动参考计数 实现自动内存管理 对于Objective-C对象和块, 将程序员从需要中解放出来 显式插入和 释放

您对内存管理的担忧将减少。有关于该主题的公开信息:

  • (lists.apple.com)
  • (clang.llvm.org)。这是ARC的技术规格

简而言之,如果规范过于苛刻而无法阅读,则需要编辑保留/发布代码以使用ARC,但旧程序仍保持兼容。你不应该把这两者都混在一起。

你似乎在谈论其他答案中提到的自动引用计数。ARC是一种GC,因为它自动释放内存,但与良好的垃圾收集器有许多不同之处

首先,它主要是一种编译技术。编译器知道Cocoa的引用计数准则,因此它会根据规则在应该的位置插入保留和释放。它的工作原理就像您自己编写了保留和释放文件一样——它只是为您插入它们。普通垃圾收集器在程序运行时跟踪程序的内存

第二,因为它就像retain和release一样,它不能捕获retain循环(如果对象A保留对象B,对象B保留对象A,并且没有其他引用它们中的任何一个,那么它们都将成为不朽的)。你需要采取同样的预防措施来防止它们


它使用的资源也不同于自动垃圾收集器。Objective-C中使用的垃圾收集器必须扫描未引用的内存并进行收集——这很昂贵,并且可能会导致较慢系统上的“口吃”——但他们只需要偶尔这样做,理论上甚至可以微调收集周期,以匹配程序实际使用内存的方式。一般来说,GC程序将比非GC程序使用更多的内存,并且在GC决定收集时会显著降低速度。另一方面,ARC将“扫描”移动到编译时,并在可用时释放内存,但它必须不断更新对象引用计数,而不是像收集器一样等待垃圾堆积。

为什么它在iOS 5中可用而在iOS 4中不可用?请在iPhone开发者连接中阅读ARC上的文档,一切都很清楚。。。但它不是GC,它是更好的东西(对于移动设备)ARC不在NDA之下,因为它是Clang/LLVM(开源)的一部分ARC和GC一样糟糕。知道自己在做什么的程序员不需要任何类型的GC。Obj-C中的内存管理非常简单…@Jenox是的,真正的程序员使用TextEdit…这不是垃圾收集。不,它比垃圾收集好。编译器知道什么需要释放,什么时候释放,所以所有的内存管理都会像你自己释放一样小心。比GC更高效,因为它在应用程序运行时不使用资源。扩展Josh的观点,如果你有循环性质的对象,这将不会有帮助-例如,对于最简单的情况,两个对象相互引用,而没有其他对象引用它们。它们的参考计数永远不会减少到零,因此它们不会被删除。编辑:@Brandon:我们使用GC的部分原因:p@Brandon,编译器知道需要释放什么以及何时释放,因此所有内存管理都会像您自己做的那样进行。你是说它也处理循环引用?不管怎样,引用计数都比好的垃圾收集器慢,而且对于多线程代码来说非常慢。@Yar:ARC仍然是引用计数-它只是自动的。引用计数算法无法检测保留周期。循环检测需要更复杂的东西,并且在运行时会产生更多的开销。非常好的东西,谢谢,@Chuck。“你需要采取与什么相同的预防措施来预防它们”?这意味着您需要避免对代理等使用“保留”属性。?另外:是否将属性声明为保留或分配?那么为retain属性重写setter呢,开发人员是否使用
retain
呢?@Yar:是的,避免在代理上保留是一个大问题。但是,您不想使用
assign
,而是希望对未保存的属性使用
weak
。至于在setter中使用
retain
:ARC模式使得显式发送
retain
release
autorelease
是非法的。您只需分配,编译器将在其认为必要的地方插入保留和释放。@Yar:启用保留和释放的具体版本在NDA下,很可能会发生更改,但它是编译器功能和运行库的组合,实现了某些功能目前有两种使用ARC的方法:1)从iOS开发者程序中获取Xcode 4.2;或者2)自己下载最新版本的LLVM,并将其用作编译器。@rogerdpack:最后一段使许多神话永存。“垃圾收集器必须扫描未引用的内存并进行收集,这是非常昂贵的”。Trac