内存管理

时间:2011-03-23 15:35:47

标签: iphone ipad memory memory-management

iphone是否支持GC(垃圾收集)?如果是,那么究竟什么是自动释放。任何人都可以回答我的问题。

由于GC与自动释放相同,即它在自己的时间释放内存

例如,像stringwithformat这样的函数是自动释放函数,请参阅此

NSXMLParser * xmlParser [[[NSXMLParser alloc] initWithData:xmlData] autorelease];

(xmlparser对象也让我们无法评论当这个对象内存被释放时)就像GC一样

简而言之,我认为iphone部分支持GC

是什么人说的?

4 个答案:

答案 0 :(得分:4)

  

iphone是否支持GC(垃圾收集)?

没有

  

由于GC与自动释放相同,即它在自己的时间释放内存

他们并没有做同样的事情。自动释放对于释放对象的时间非常具体:您确切知道它何时会发生。

向对象发送自动释放将在下次当前自动释放池耗尽时释放内存。自动释放池可以跟踪已发送的对象autorelease

默认情况下,只有一个自动释放池,每次循环运行循环时它都被耗尽(即释放所有对象)。

运行循环因此起作用。每次事件发生时(例如定时器触发,或者用户与应用程序交互),运行循环将确定哪个对象应该处理事件并调用适当的方法。当该方法返回时,运行循环继续前进到下一个事件,但在此之前它会耗尽其自动释放池。 (这有点简化,但足够接近理解这个概念。)

这在实践中意味着什么? (我听到你哭了。)这意味着如果你在某个方法中自动释放一个对象,那么该对象实际上不会被发送release,直到该方法返回,并且调用它的方法返回,并且方法是称之为,等等一直到顶部。这就是为什么它在从方法返回对象时经常使用它们:你知道它们会持续足够长的时间让调用者对它们进行评估(并在需要时保留它们)。

答案 1 :(得分:1)

听起来你正在混淆释放与易玩。非常重要的是要意识到释放对象将其从内存中删除。通过递减保留计数,释放对象告诉运行时您已完成该对象。当保留计数达到0时,该对象实际上已从内存中释放。所以自动释放与GC不同,因为它只会自动释放对象,它不会自动 dealloc 对象。

答案 2 :(得分:0)

iOS不支持垃圾收集。垃圾收集将删除任何不再引用它们的对象。在iOS上,如果你没有引用一个对象,那么内存中的空间就会丢失,你就会有内存泄漏。

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

e.g:

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

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

答案 3 :(得分:0)

不,iPhone不支持GC。

GC与自动释放不同。即使使用自动释放,您仍然可能存在内存管理错误,即内存泄漏和访问已释放的内存。版本和自动释放仍然必须与保留/分配平衡。

自动释放就是这样,方法可以创建(alloc和init)一个对象,并以引用计数 为零的方式返回它们,但是调用方法仍然可以访问它们。