Objective-C是否在iPhone上有垃圾收集器?

时间:2010-04-11 17:23:48

标签: objective-c iphone garbage-collection

我正在考虑为iphone编写应用程序。但我对Objective-c语言感到困惑。我说我必须做自己的记忆管理吗? Objective-C是一种托管语言,如C#和/或Java吗?

谢谢!

5 个答案:

答案 0 :(得分:11)

“管理”是一个没有技术含义的营销术语。 iPhone的目标C不是垃圾收集,而是使用保留计数内存管理。所以在某种意义上,你必须自己做内存管理,但仅限于了解Cocoa retain counting methodology

编辑:我对“托管”的评论是指previous post version。评论留在这里是因为我厌倦了看到这个词。

答案 1 :(得分:4)

没有垃圾收集功能。但是,您copyretainalloc等任何对象的保留计数都会增加一个,您有责任调用release或{{1你拥有该对象的一个​​实例。如果您没有拨打autorelease[<YOUROBJECT> release];,该对象仍会保留在iPhone的/ iPod Touch / iPad的内存中,但指针不再保留,并且会发生内存泄漏,因为该内存可以不再被访问。自动释放将对象添加到自动释放池,并意味着它将在将来的某个时间点释放。始终尽可能使用标准[<YOUROBJECT> autorelease];,因为release意味着它仍然会在设备的内存中保留一段时间,您永远无法确定它何时会被释放,而且要求稍高一些打电话的方法。

永远不要在对象上调用autorelease - 释放或自动释放就足够了,如果需要,对象将自动被释放。

确保永远不会释放您不拥有的对象,并且如果您确实发布了对象,则在您不再使用它们之后将其释放 - 否则,您可能会尝试访问该对象,并且设备无法找到对象和情况会导致您的应用因dealloc错误而崩溃 - 找出问题的根源,打开仪器,添加对象分配工具并在其首选项中启用NSZombie检测(或添加Zombies工具(仅适用于iPhone SDK 3.2+))。然后,您可以查看导致问题的对象的整个历史记录,并跳转到导致问题的确切代码行。

您可以阅读更多here

希望这有帮助

答案 2 :(得分:1)

您必须使用Objective-C on the iPhone进行自己的内存管理。

答案 3 :(得分:1)

正如其他人所指出的,Objective-C在iPhone上没有垃圾收集器,但它确实有一个用于Mac OSX。这篇文章更详细地描述了这一点:http://vasudevkamath.blogspot.com/2010/01/objective-c-my-opinions.html

答案 4 :(得分:0)

答案并非针对Objective-C。如果你正在进行iPhone开发,没有...没有垃圾收集器。但是,如果您正在为Mac OSX开发,则会收集垃圾。