【发布时间】:2011-01-03 01:49:17
【问题描述】:
我的代码当然包含所有的保留/释放调用。 . .使用垃圾收集(然后我如何处理保留/释放)编写 mac 应用程序是否更容易?
无论您推荐哪种方式,有关相关 Xcode 设置的任何指示都会有所帮助。谢谢。
【问题讨论】:
标签: cocoa macos ios memory-management
我的代码当然包含所有的保留/释放调用。 . .使用垃圾收集(然后我如何处理保留/释放)编写 mac 应用程序是否更容易?
无论您推荐哪种方式,有关相关 Xcode 设置的任何指示都会有所帮助。谢谢。
【问题讨论】:
标签: cocoa macos ios memory-management
我强烈建议您出于各种原因不要在 Mac 上使用 GC,只要坚持您已经习惯的方式即可。我相信当你依赖 GC 来管理内存时,你会放弃很多细粒度的控制,而我个人并不喜欢这样做。
由于您已经来自像 iOS 这样的引用计数环境,我认为您最好留在那个环境中,因为此时您不会花费更多的精力。
您需要将视图控制器和基于视图的代码移植到 Cocoa,但这应该不会太麻烦。您可以放入您的模型,因为它们没有任何视图依赖项。 (当然,假设你是在清醒的情况下做到的)。
【讨论】:
我要恭敬地不同意迄今为止回答的每个人,并告诉您不要立即关闭 Mac 上的垃圾收集。我所有的 Mac 应用程序都使用垃圾回收,而且我构建的所有新应用程序都会这样做。
垃圾收集为我节省了大量麻烦的地方在于大量多线程代码。在内存管理方面,我认为自己相当不错,但涉及跨线程释放和自动释放的边缘情况导致大量机器人控制软件偶尔崩溃,直到我将其转换为垃圾收集。之后,所有这些问题都消失了,整体稳定性大大提高(我使用了六个月,没有看到其中一个较新版本出现崩溃)。
如果开发将在 Mac 和 iOS 之间共享的代码,一定要按照标准的内存管理规则编写,这样你就可以保持良好的习惯,并保证东西可以来回复制和粘贴。然后,您可以在 Mac 版本中启用垃圾收集作为构建时设置,以在您错过泄漏或过度释放的情况下充当安全网。您不会以这种方式节省代码,但这可能会提高应用程序在部署给用户时的稳定性。
但是,某些框架(例如 Core Image)不能很好地处理垃圾回收,因此如果您在应用程序中使用其中一种框架,则可能需要避免 GC。
正如 Mike Ash 在他的文章“Perform Better With Garbage Collection”中指出的那样,垃圾收集器在后台线程上运行这一事实可能会导致多核 Mac 上的某些应用程序的性能略有提升。例如,当自动释放池被耗尽或其他对象被释放时,它可以防止您有时在紧密循环中看到的主线程停止。
最后,我喜欢在垃圾收集下测试我的跨平台 Cocoa 代码,以确定我在 -dealloc 中放置了与内存无关的清理代码的位置(它确实不属于),因为 -dealloc 不是在垃圾收集下不再调用。这有助于我更好地构建我的代码。
【讨论】:
保持原样。不使用 GC 可以让它在 mac 上运行得更快。它还可以让您更好地控制事物何时停留和何时离开,最终可能会为您提供更稳定的应用程序。
它还可以让您更轻松地将您在 mac 上编写的内容移植回来。如果你回到 iOS,这样做也会让你养成这种习惯。
总之,如果你已经做了内存管理,那就继续做吧!
【讨论】: