1

本题旨在了解当前 Objective-C 的手动内存管理,以及它在过去的使用。

据说使用Objective-C多年的人几乎把Objective-C中的内存管理当成一种“反射”……(the alloc, retain, release, autorelease

但是如果在计算机上使用Objective-C,那不就是垃圾回收吗?直到最近在 iPhone 和 iPad 上使用 Objective-C 才需要手动管理,这不是真的吗,因为 iOS 没有垃圾收集?过去,可能是在 90 年代,Objective-C 没有垃圾收集,或者它总是有垃圾收集但自从 iPhone 出来之后,然后retainrelease添加到语言中?

4

3 回答 3

4

为了回答您实际提出的问题,Objective-C 仅在 2007 年(后期)发布的 Mac OS X 10.5 Leopard 中获得了垃圾收集功能。在此之前,手动内存管理是唯一的选择。即使在 Leopard 发布之后,大多数 Cocoa 开发人员也没有使用垃圾收集,原因有很多:现有代码库的惯性、需要支持旧的 OS 版本、使用垃圾收集固有的性能损失、iOS 上不支持等等。

ARC 被更快地采用有几个原因,我(当然还有 Apple)认为它是比垃圾收集更好的解决方案。ARC 随 iOS 5.0 和 Mac OS X 10.7 Lion 的发布提供(部分支持部署到 iOS 4.3 和 Mac OS X 10.6)。Lion 和 iOS 5 都在不到一年前发布,因此任何编写 Objective-C 时间超过该时间的开发人员都使用/使用手动引用计数,你说得对,它对我们大多数人来说是自反的。

尽管 ARC 被迅速采用,至少与垃圾收集相比,它的使用还远未普及。任何需要支持 iOS 4.2 或更早版本或 Mac OS X 10.5 或更早版本的人仍然必须使用手动引用计数。此外,我认为有很多经验丰富的 Cocoa 程序员还没有看到切换到 ARC 的理由,因为对他们来说,手动引用计数并不是一个巨大的负担。

于 2012-05-19T18:13:45.587 回答
4

但是如果在计算机上使用Objective-C,那不就是垃圾回收吗?

首先,就 ObjC 而言,垃圾收集是一项新功能,于 2007 年与 OS X 10.5 同时引入。其次,它是一个框架功能——也就是说,它是Cocoa的一部分——不是语言本身的一部分。它仍然可以在 OS X 上使用,但据我所知,Apple 并不打算再使用它。ARC 是新的系统提供的内存管理范例。

直到最近在 iPhone 和 iPad 上使用 Objective-C 才需要手动管理,这不是真的吗,因为 iOS 没有垃圾收集?过去怎么样,可能回到 90 年代,Objective-C 没有垃圾收集,或者它总是有垃圾收集但自从 iPhone 出来后,

不,从 NeXT 时代开始,直到引入 Cocoa 的垃圾收集,桌面上总是需要手动内存管理(就像在 C++ 或 C 中一样)。即使在 GC 可用之后,由于性能问题或需要在较旧的 OS 版本上运行,许多人还是更愿意坚持使用 MRR。

那么retainandrelease被添加到语言中了吗?

特定的方法retainrelease以及它们启用的引用计数系统同样是框架的一部分,而不是语言,但由于 Cocoa 是使用 ObjC 的卓越框架(其他 ObjC 框架,如 GNUStep,模仿 Cocoa),它是编写 ObjC 时执行内存管理的主要方式。(当然,Cocoa 继承了NeXT 的retain/release系统。)

完全可以使用自己的内存管理方法/系统编写另一个根类。但是,这样做并尝试与 Cocoa 交互会有点疯狂,而且它根本无法用 ARC 编译。

于 2012-05-19T18:16:07.887 回答
1

手动内存管理(或 ARC,它告诉编译器尝试为您执行一些手动内存管理)允许更确定的运行时性能,以及更好地控制应用程序的峰值内存使用,这两者在小型移动设备上都非常重要。为什么要浪费用户的电池寿命来进行垃圾收集,通常是在较差的时候以获得良好的动画和 UI 响应?

于 2012-05-20T02:30:17.947 回答