我正在考虑为iphone编写应用程序。但我对Objective-c语言感到困惑。我说我必须做自己的记忆管理吗? Objective-C是一种托管语言,如C#和/或Java吗?
谢谢!
答案 0 :(得分:11)
“管理”是一个没有技术含义的营销术语。 iPhone的目标C不是垃圾收集,而是使用保留计数内存管理。所以在某种意义上,你必须自己做内存管理,但仅限于了解Cocoa retain counting methodology。
编辑:我对“托管”的评论是指previous post version。评论留在这里是因为我厌倦了看到这个词。
答案 1 :(得分:4)
没有垃圾收集功能。但是,您copy
,retain
,alloc
等任何对象的保留计数都会增加一个,您有责任调用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开发,则会收集垃圾。