这个问题的目的是了解Objective-C当前的手动内存管理,以及它在过去的使用情况。
据说,使用Objective-C多年的人几乎将Objective-C中的内存管理视为“反射”……( alloc、retain、release、autorelease)
但是,如果在计算机上使用Objective-C,那么不是真的存在垃圾回收吗?在Objective-C中不需要手动管理,直到最近在iPhone和iPad上使用它,因为iOS没有垃圾回收,这不是真的吗?在过去,也许是在90年代,当Objective-C没有垃圾回收的时候,或者它总是有垃圾回收,但是自从iPhone出现后,retain和release就被添加到了语言中?
发布于 2012-05-20 02:13:46
为了回答你实际提出的问题,Objective-C只是在2007年(晚些时候)发布了MacOSX10.5Leopard才获得了垃圾回收功能。在此之前,手动内存管理是唯一的选择。即使在Leopard发布之后,大多数Cocoa开发人员也因为各种原因而不使用垃圾收集:现有代码库的惰性,需要支持较旧的操作系统版本,使用垃圾收集固有的性能损失,在iOS上不支持等。
由于几个原因,ARC得到了更快的采用,我(当然还有苹果公司)认为它是一个比垃圾收集更好的解决方案。ARC是随MacOSX5.0和MacOSX10.7Lion发布的(部分支持部署到iOS 4.3和MacOSX10.6)。Lion和iOS 5都是在不到一年前发布的,所以任何编写Objective-C时间超过一年的开发人员都会使用/使用手动引用计数,你是正确的,它对我们大多数人来说都是自反式的。
虽然ARC已经被迅速采用,至少与垃圾收集相比,它的使用仍然远未普及。任何需要支持MacOS4.2或更早版本或者MacOSX10.5或更早版本的人都必须使用手动引用计数。此外,我认为有很多经验丰富的Cocoa程序员还没有看到切换到ARC的理由,因为对他们来说,手动引用计数并不是一个巨大的负担。
发布于 2012-05-20 02:16:08
但是,如果在计算机上使用Objective-C,那么不是真的有垃圾回收吗?
首先,就ObjC而言,垃圾收集是一个新特性,于2007年与OSX10.5同时引入。其次,它是一个框架特性--也就是说,它是Cocoa的一部分--而不是语言本身的一部分。它仍然可以在OS上使用,但据我所知,苹果公司并不打算再使用它。ARC是新的系统提供的内存管理范例。
在Objective-C中不需要手动管理,直到最近在iPhone和iPad上使用它,因为iOS没有垃圾回收,这不是真的吗?在过去,也许回到90年代,Objective-C没有垃圾回收,或者它总是有垃圾回收,但自从iPhone问世以来,
不,从NeXT时代起,直到引入Cocoa的垃圾收集,桌面上的手动内存管理一直是必要的(就像在C++或C中一样)。即使在有了GC之后,由于性能问题或需要在较旧的操作系统版本上运行,许多人仍倾向于坚持使用MRR。
然后retain和release被添加到语言中?
特定的方法retain和release,以及它们启用的引用计数系统,同样是框架的一部分,而不是语言的一部分,但由于Cocoa是使用ObjC的卓越框架(其他ObjC框架,如GNUStep,模仿Cocoa),所以它是编写ObjC时执行内存管理的主要方式。(当然,Cocoa继承了NeXT的retain/release系统。)
完全可以使用自己的内存管理方法/系统来编写另一个根类。然而,这样做并试图与Cocoa交互是有点疯狂的,而且它根本不能用ARC编译。
发布于 2012-05-20 10:30:18
手动内存管理(或ARC,它告诉编译器尝试为您执行一些手动内存管理)允许更确定的运行时性能,并更好地控制应用程序的峰值内存使用,这两点在小型移动设备上都非常重要。为什么要把用户的电池寿命浪费在垃圾回收上,往往是在最糟糕的时候,为了获得良好的动画效果和UI响应性?
https://stackoverflow.com/questions/10667630
复制相似问题