内存管理

3
iPhone是否支持垃圾回收(GC)?如果是的话,那么“自动释放”(auto release)到底是什么?能否有人回答我的问题?
由于GC和auto release都会在它们自己的时间释放内存,所以它们实际上做的是相同的事情。
例如,像stringwithformat这样的一些函数是自动释放函数,看这个:
NSXMLParser *xmlParser [[[NSXMLParser alloc] initWithData:xmlData] autorelease];
(我们也无法评论xmlparser对象的内存何时被释放)就像GC一样。
简而言之,我认为iPhone部分支持GC。
大家怎么说?
4个回答

4
不支持。 由于GC和自动释放(Autorelease)的作用相同,即在自己的时间释放内存。 它们并不完全相同。自动释放非常明确何时释放对象:您知道它将在何时发生。
向对象发送autorelease将在当前自动释放池下次被清空时释放内存。自动释放池是一个跟踪已发送“autorelease”的对象的东西。
默认情况下,只有一个自动释放池,并且每次运行循环都会排干(即释放其所有对象)。
运行循环的工作原理如下。每次发生事件(例如计时器触发或用户与应用程序交互),运行循环都会确定哪个对象应处理事件并调用适当的方法。当该方法返回时,运行循环移动到下一个事件,但在执行此操作之前,它会排空其自动释放池。(这有点简化,但足以理解概念。)
实际上意味着什么?(我听到你在问。)这意味着如果您在某个方法中自动释放一个对象,则该对象实际上直到该方法返回,调用它的方法返回,调用该方法的方法返回等等一直到最顶层才会被释放。这就是为什么在从方法返回对象时经常使用它:您知道它们将持续足够长的时间供调用者评估它们(如果需要,会保留它们)。

1

听起来你把释放和释放内存混淆了。非常重要的是要意识到,释放一个对象并不会将其从内存中删除。释放一个对象告诉运行时你已经完成了该对象,通过减少保留计数。当保留计数达到0时,对象才会真正地从内存中释放。因此,自动释放池不同于垃圾回收,因为它只自动释放对象,而不是自动释放内存


0

iOS不支持垃圾回收。垃圾回收会移除任何没有引用的对象。在iOS上,如果您没有对一个对象的引用,则该内存空间将丢失并导致内存泄漏。

autoRelease告诉对象在不久的将来释放。这在某些情况下非常有用,比如返回在函数中创建的对象,在那里你将无法释放它。

e.g.:

+ (id) createNewObject { id *newObject = [[Object alloc] init]; [newObject autoRelease]; return newObject; }

在这种情况下,调用此函数的对象必须保留返回的对象,以便它不会从内存中删除。


0

不,iPhone不支持GC。

GC与自动释放并不相同。即使使用自动释放,仍然可能出现内存管理错误,例如内存泄漏和访问已释放的内存。释放和自动释放仍然需要与保留/分配平衡。

自动释放存在的目的是让方法可以创建(分配和初始化)一个对象,并以这样一种方式返回它们,即引用计数将为零,但调用方法仍然可以访问它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接