iPhone上的Objective-C是否有垃圾回收器?

5
我在考虑为 iPhone 开发一个应用程序。但是我对 Objective-C 语言感到困惑。我是否正确地说,我必须自己进行内存管理?Objective-C 是否像 C# 和/或 Java 一样是一种托管语言呢?
谢谢!
5个回答

11
“托管”是一个没有技术含义的营销术语。iPhone上的Objective C并不是垃圾回收,而是使用保留计数内存管理。因此,在某种意义上,你必须自己进行内存管理,但仅限于了解“Cocoa 保留计数方法学”。
注:我对“托管”一词的评论是针对先前版本的帖子。我将该评论保留在这里,因为我已经看厌了这个词。

5
没有垃圾回收功能。但是,任何你 copy, retain, alloc 等的对象都会增加其保留计数,你需要调用一个 release 或者一个 autorelease 来释放该对象 - 你拥有该对象的实例。如果你不调用 [<YOUROBJECT> release]; 或者 [<YOUROBJECT> autorelease];,那么该对象将留在 iPhone/iPod Touch/iPad 的内存中,但指针不再存在,这会导致内存泄漏,因为无法再访问该内存。自动释放将对象添加到自动释放池中,并意味着它将在未来某个时刻被释放。尽可能使用标准的 release,因为 autorelease 意味着它仍然会在设备的内存中停留一段时间,你永远无法确定何时会被释放,而且这是一种稍微要求更高的方法。
永远不要对一个对象调用 dealloc - 释放或自动释放足够了,如果需要,对象将自动被释放。
确保您不要释放您不拥有的对象,如果您释放了对象,则在您不再需要它们之后释放它们 - 否则,您可能会尝试访问该对象,而设备无法找到该对象,并且情况会导致应用程序崩溃,因为出现了EXEC_BAC_ACCESS错误 - 要查找问题的根本原因,请打开Instruments,添加Object Allocation工具并在其首选项中启用NSZombie检测(或添加Zombies工具(仅适用于iPhone SDK 3.2+))。然后,您可以查看导致问题的整个对象历史记录,并跳转到导致问题的确切代码行。
您可以在这里阅读更多内容。
希望这有所帮助。

1

1

0

这个答案并不特定于Objective-C。如果你正在进行iPhone开发,那么...没有垃圾回收器。然而,如果你是在为Mac OSX开发,那么就有垃圾回收。


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