我开发了一款应该支持基于iOS4和iOS5的iPhone / iPad的iPhone应用程序。
我的应用程序在很少的地方泄漏内存,由于代码的大小而变得难以调试。我最近读到了ARC(自动引用计数),我的查询是
我是否需要修改我的源代码(retain / release / alloc / dealloc)以使用ARC进行编译。 还有我们需要使用ARC执行的所有更改?
建议转到ARC吗?
如果我使用ARC
感谢。
答案 0 :(得分:14)
这可能不是发布此问题的最佳地点,但我会回答,因为我不介意这里的问题。
http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html
您将使用迁移工具'编辑>重构>转换为Objective-C ARC'并手动修复工具无法弄清楚的任何内容。
是。
是的但归零弱引用不会。
答案 1 :(得分:4)
我绝对认为程序员理解内存管理以及系统实际工作方式是有益的......但是,我认为ARC是一个非常好的系统并且工作得非常好。这真的是一个意见问题,所以我的意见是,除非在特定的情况下,几乎总是值得开始在ARC上针对iOS 5应用的新项目。
我觉得如果你在代码中使用了很多C库,那么ARC现在使用起来有点困难(所以如果你主要使用第三方C库和像CoreFoundation这样的东西,你可能会考虑是否有意义),但即便如此,如果这些库大多与您的Objective-C控制器隔离,那么ARC仍然很好。
对于较旧的应用,您需要查看应用使用情况和模式。如果你使用了很多委托方法,因为你不能在iOS 4上使用弱引用,它会变得有点棘手,你可能需要混合ARC和非ARC代码。做出设计决定以推进ARC可能会更好。所以新功能是针对iOS 5设计的,可能在iOS 4版本的应用程序中不可用(或完全可用),而且那些使用ARC。
实际上,最终,它将取决于您的应用程序的设计方式,大小,以及您对托管内存管理和ARC的使用/限制的舒适程度。例如,我有三个项目,我永远不会转换为ARC,一个我现在正在混合的项目,一个完全转换(但仍然针对iOS 4+)和2个完全基于ARC和iOS 5+的项目仅
答案 2 :(得分:1)
要明确的是,如果您定位iOS 4,则无法使用ARC弱引用, 仍然可以使用unsafe_unretained
,这基本上等同于使用{{1对象属性。这意味着您可以将任何编写良好的非ARC代码转换为ARC,而不会在iOS 4上意外创建保留周期。
通过使用assign
,您会失去弱引用的自动空功能,但您仍然可以获得ARC的所有其他好处,例如不必担心忘记在dealloc语句中释放ivars等