作为一名新的Objective-C开发人员,我应该注意哪些与内存相关的问题?

RLH*_*RLH 8 memory-management objective-c ios automatic-ref-counting

最近我开始使用Objective-C为iOS 5设备编写代码.我的全新MacBook加载了Xcode 4.2和最新的Mac和iOS SDK.到目前为止,这是一个有趣的体验,但我看到有一个问题,我目前的文档状态和可用的书籍.

具体来说,大多数书籍(尚未更新)总是参考如何以及何时管理你的记忆.这很好,但是,当前的SDK /编译器包括自动引用计数,因为我为我的项目打开了这个,我不知道我应该亲自监视和管理自己.

我来自C#背景.C#中的内存管理(技术上称为.NET)完全由框架垃圾收集器处理.我知道ARC实际上是一个编译器功能,可以自动添加它所属的样板代码.此外,我尝试发现我应该管理自己发布的对象的尝试只会导致编译错误,因为ARC希望为我处理它.

我还没有找到一个我需要管理我的对象的案例.我变得"懒惰",因为我不知道要监视和释放自己,我完全忘记了这种行为如何影响我的应用程序的性能.

在新用户方面,我在iOS项目中使用ARC时应该注意哪些"陷阱"?我已经在这里阅读了一些关于内存管理和ARC的问题但是,老实说,他们不会对新的iOS开发人员友好.有人可以给出一个合理的,可以提出的问题清单,说明需要注意的问题和问题,以及关于何时需要对内存进行自我管理的公平指南?

jus*_*tin 13

  • 通函参考.当对象是相互依赖的时,它们就会泄漏.您需要将某些引用标记为弱,并且Instruments可以帮助您找到这些引用.这些泄漏甚至不会显示为泄漏,因为它们相互之间具有很强的参考性.

  • 创建自动释放池@autorelease以将自动释放池大小保持在您创建许多自动释放对象(直接或间接)的位置.具体来说,您所依赖的程序和程序将包含autorelease许多对象(ARC或其他).自动释放的对象是将在"将来"发布的对象.每个Cocoa程序都希望每个线程都有一个自动释放池.这就是您在创建新线程时创建新池的原因,以及为什么要在其中创建新线程main.池作为堆栈运行 - 您可以推送和弹出池.当一个池被销毁时,它会将延迟release消息发送给它所拥有的每个对象.这意味着具有许多临时分配的非常大的循环可能导致许多仅由池引用的对象,并且池可能变得非常大.因此,在某些情况下,您可以直接排空管理池,以最大限度地减少等待释放和取消分配的对象数.

  • 使用适当的桥接/铸造.有时您需要明确管理生命周期.ARC处理明显的情况,但是在一些复杂的情况下,您需要明确地管理生命周期.

  • 在'核心'API中使用malloc'ed和new'ed分配以及不透明类型时.ARC仅管理NSObject类型.您仍然需要为这些分配,类型以及与这些API接口时显式释放,删除和使用正确的引用计数.

  • 始终遵循NS-API命名约定,并尽可能避免显式内存管理属性.

  • 在没有ARC或GC的情况下编译源代码时,您显然需要MRC.这在使用/使用其他库/代码体时非常常见.当然,编译器正确处理交互,因此您的ARC程序不应泄漏.

  • 如果你使用正确的命名和书写风格,ARC会处理你需要的大部分内容,但是会有一些其他的极端情况.幸运的是,如果您在开发过程中没有意识到这些问题,仍然可以运行Leaks和Zombies来查找这些问题.

  • 我建议谈论"临时"对象而不是"自动释放"对象,因为直接进入ARC的人可能根本不知道自动释放的对象是什么.从技术上讲,"临时"!="自动释放",但在大多数情况下,建议将是好的. (2认同)