作为一名新的Objective-C开发人员,使用ARC时应该注意哪些与内存相关的问题?
最近,我开始为iOS5设备编写Objective-C代码。我的全新MacBook装有Xcode 4.2和最新的Mac&iOS SDK。到目前为止,这是一次有趣的经历,但我发现当前文档和可用书籍的状态存在一个问题 具体来说,大多数书籍(尚未更新)总是提到如何以及何时管理你的记忆。这很好,但是,当前的SDK/编译器包括自动引用计数,而且由于我在项目中启用了此功能,因此我不知道我应该亲自监视和管理什么 我是C#出身。C#(技术上是.NET)中的内存管理完全由框架垃圾收集器处理。据我所知,ARC实际上是一种编译器功能,它可以自动在它所属的位置添加锅炉板代码。此外,我尝试并发现我应该在哪里管理我自己的对象发布,这只会导致编译器错误,因为ARC想为我处理它 我还没有找到需要管理对象的案例。我变得“懒惰”,因为我不知道监视和释放自己什么,我完全不知道这种行为会如何影响我的应用程序的性能 在新的用户术语中,在iOS项目中使用ARC时,我应该注意哪些“陷阱”?我在这里读到了一些关于内存管理和ARC的问题,但老实说,它们对新的iOS开发人员并不友好。有人能给出一个合理的要点清单,说明需要注意的问题和问题,以及何时需要自我管理内存的公平指南吗?作为一名新的Objective-C开发人员,使用ARC时应该注意哪些与内存相关的问题?,objective-c,ios,memory-management,automatic-ref-counting,Objective C,Ios,Memory Management,Automatic Ref Counting,最近,我开始为iOS5设备编写Objective-C代码。我的全新MacBook装有Xcode 4.2和最新的Mac&iOS SDK。到目前为止,这是一次有趣的经历,但我发现当前文档和可用书籍的状态存在一个问题 具体来说,大多数书籍(尚未更新)总是提到如何以及何时管理你的记忆。这很好,但是,当前的SDK/编译器包括自动引用计数,而且由于我在项目中启用了此功能,因此我不知道我应该亲自监视和管理什么 我是C#出身。C#(技术上是.NET)中的内存管理完全由框架垃圾收集器处理。据我所知,ARC实际上是
- 循环引用。当对象相互依赖时,它们将泄漏。您需要将某些引用标记为弱引用,仪器可以帮助您定位这些引用。这些泄密甚至不会显示为泄密,因为它们彼此有很强的引用关系
- 创建自动释放池
,以便在创建许多自动释放对象(直接或间接)的位置降低自动释放池的大小。具体来说,您的程序和您所依赖的程序将@Autorelease
许多对象(圆弧或其他)。自动释放的对象是“将来”将被释放的对象。每个Cocoa程序都希望每个线程上都存在一个自动释放池。这就是创建新线程时创建新池的原因,也是在自动释放
中创建新池的原因。池作为堆栈运行-您可以推送和弹出池。当一个池被销毁时,它会将其延迟的main
消息发送给它所持有的每个对象。这意味着具有许多临时分配的真正大的循环可能会导致许多仅由池引用的对象,并且池可能会变得非常大。因此,在某些情况下,您可以直接排空管理池,以尽量减少等待释放和释放的对象数量release
- 使用适当的桥接/铸造。有时,您需要明确地管理生命周期。ARC处理明显的情况,但也有一些复杂的情况需要显式地管理生命周期
- 在“核心”API中使用
'ed和malloc
'ed分配以及不透明类型时。ARC仅管理new
类型。您仍然需要显式地释放、删除和使用这些分配、类型以及与这些API接口时的正确引用计数NSObject
- 始终遵循NS-API命名约定,以及
- 当编译没有ARC或GC的源代码时,显然需要MRC。这在使用/处理其他库/代码体时非常常见。当然,编译器正确地处理交互,因此您的ARC程序不应泄漏
- 如果您使用正确的命名和书写风格,ARC将处理您所需要的大部分内容,但也会有一些其他情况。幸运的是,如果您在开发过程中没有意识到这些问题,您仍然可以运行泄漏和僵尸来定位这些问题