将iOS应用程序移植到mac – 如何处理内存pipe理?

我的代码当然有所有的保留/释放调用。 。 。 是否可能更容易与垃圾收集编写mac应用程序(然后我怎么做的保留/释放)或没有?

无论您推荐哪种方式,任何有关Xcode设置的指针都会有所帮助。 谢谢。

我强烈build议你不要因为各种原因在Mac上使用GC,只是坚持你已经习惯的做法。 我相信当你依靠GC来pipe理内存的时候,你放弃了很多细粒度的控制,我个人不喜欢这样做。

既然你已经从像iOS这样的引用计数的环境中出来了,我认为在这个环境下保持这种状态是明智的,因为在这一点上你不会付出太多的努力。

你将需要将你的视图控制器和基于视图的代码移植到Cocoa,但这不应该太麻烦。 您可以放入模型,因为它们没有任何视图依赖性。 (当然,假设你以一种理智的态度来做)。

我会恭敬地不同意所有已经回答的问题,并且告诉你不要立即拒绝Mac上的垃圾回收。 我所有的Mac应用程序都使用垃圾回收function,所有新build的应用程序都会这样做。

垃圾收集为我节省了大量的麻烦,在大量的multithreading代码中。 在内存pipe理方面,我认为自己很合理,但涉及跨线程释放和自动释放的边缘案例导致机器人控制软件偶尔崩溃,直到我将其转换为垃圾回收。 所有这些问题都随之消失,导致整体上更加稳定(我花了六个月的时间没有看到最新版本的崩溃)。

如果开发将在Mac和iOS之间共享的代码,那么一定要按照标准的内存pipe理规则来编写代码,以便保持良好的习惯,并保证可以复制和粘贴。 然后,您可以在Mac版本中将垃圾收集作为构build时间设置启用,以作为您错过泄漏或过度销毁的情况下的安全网。 您不会以这种方式保存代码,但这可能会提高应用程序在部署到用户时的稳定性。

但是,像Core Image这样的某些框架在垃圾收集方面效果不好,所以如果在应用程序中使用其中一种框架,则可能需要避免使用GC。

正如Mike Ash在他的文章“ 使用垃圾回收进行更好的performance ”中指出的那样,垃圾回收器在后台线程上运行的事实可能会导致多核Mac上的某些应用程序略微提高性能。 例如,它可以防止主线程中的暂停,因为autorelease池正在被耗尽或者其他对象被释放,所以有时会在紧密的循环中看到暂停。

最后,我喜欢在垃圾收集下testing我的crossplatform Cocoa代码,以确定我在哪里放了非内存相关的清理代码,放在-dealloc (它真的不属于这个地方),因为-dealloc不再被垃圾收集。 这可以帮助我更好地构build我的代码。

保持它的方式。 不使用GC将允许它在Mac上运行得更快。 它也让你更好地控制什么时候停留,什么时候停止,最终可能给你一个更稳定的应用程序。

这也将使您更方便地移植你在Mac上写的东西。 如果你回到iOS,这样做也会使你保持习惯。

所以总之如果你已经做了内存pipe理一直在做!