这个问题旨在了解Objective-C目前的手动内存管理及其在过去的使用。
据说,使用Objective-C多年的人几乎将Objective-C中的记忆管理视为“反射”...(alloc
,retain
,{{1 },release
)
但是,如果在计算机上使用Objective-C,那么垃圾收集是不是真的?在最近在iPhone和iPad上使用Objective-C之前不需要手动管理是不是因为iOS没有垃圾收集?过去,也许早在90年代,当Objective-C没有垃圾收集,或者它总是有垃圾收集,但是自从iPhone问世以来,autorelease
和retain
被添加了语言?
答案 0 :(得分:4)
为了回答您实际提出的问题,Objective-C仅在2007年末(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的理由,因为对他们来说,手动引用计数并不是一个巨大的负担。
答案 1 :(得分:4)
但如果在计算机上使用Objective-C,那么是不是真的有垃圾收集?
垃圾收集首先是一个新的功能,就像ObjC一样,在2007年与OS X 10.5同时推出。其次,它是一个框架功能 - 也就是说,它是 Cocoa 的一部分 - 不是语言本身的一部分。它仍可在OS X上使用,但据我所知,Apple并不打算再使用它。 ARC是新系统提供的内存管理范例。
在最近在iPhone和iPad上使用Objective-C之前不需要手动管理是不是因为iOS没有垃圾收集?在过去,也许早在90年代,当Objective-C没有垃圾收集,或者它总是有垃圾收集但是自从iPhone问世以来,
不,从NeXT时代起,在桌面上总是需要手动内存管理(就像在C ++或C中一样),直到引入Cocoa的垃圾收集。即使在提供GC后,由于性能问题或需要在较旧的操作系统版本上运行,许多人更愿意坚持使用MRR。
然后将
retain
和release
添加到语言中?
具体方法retain
和release
以及它们启用的引用计数系统再次是框架的一部分,而不是语言,但由于Cocoa是使用的卓越框架ObjC(其他ObjC框架,如GNUStep,模仿Cocoa),这是在编写ObjC时执行内存管理的主要方式。 (Cocoa当然继承了NeXT的retain
/ release
系统。)
完全可以使用自己的内存管理方法/系统编写另一个根类。尽管如此,这样做并尝试与Cocoa进行交互会有点疯狂,而且根本不能用ARC编译。
答案 2 :(得分:1)
手动内存管理(或ARC,它告诉编译器尝试为您做一些手动内存管理)允许更确定的运行时性能,并更好地控制应用程序的峰值内存使用,这对小型移动设备都非常重要设备。为什么浪费用户的电池寿命进行垃圾收集,往往是在更糟糕的时候才能获得良好的动画效果和用户界面响应能力?