iphone是否支持GC(垃圾收集)?如果是,那么究竟什么是自动释放。任何人都可以回答我的问题。
由于GC与自动释放相同,即它在自己的时间释放内存
例如,像stringwithformat这样的函数是自动释放函数,请参阅此
NSXMLParser * xmlParser [[[NSXMLParser alloc] initWithData:xmlData] autorelease];
(xmlparser对象也让我们无法评论当这个对象内存被释放时)就像GC一样
简而言之,我认为iphone部分支持GC
是什么人说的?答案 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)一个对象,并以引用计数 为零的方式返回它们,但是调用方法仍然可以访问它们。