Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
作为一名新的Objective-C开发人员,使用ARC时应该注意哪些与内存相关的问题?_Objective C_Ios_Memory Management_Automatic Ref Counting - Fatal编程技术网

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

作为一名新的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实际上是

最近,我开始为iOS5设备编写Objective-C代码。我的全新MacBook装有Xcode 4.2和最新的Mac&iOS SDK。到目前为止,这是一次有趣的经历,但我发现当前文档和可用书籍的状态存在一个问题

具体来说,大多数书籍(尚未更新)总是提到如何以及何时管理你的记忆。这很好,但是,当前的SDK/编译器包括自动引用计数,而且由于我在项目中启用了此功能,因此我不知道我应该亲自监视和管理什么

我是C#出身。C#(技术上是.NET)中的内存管理完全由框架垃圾收集器处理。据我所知,ARC实际上是一种编译器功能,它可以自动在它所属的位置添加锅炉板代码。此外,我尝试并发现我应该在哪里管理我自己的对象发布,这只会导致编译器错误,因为ARC想为我处理它

我还没有找到需要管理对象的案例。我变得“懒惰”,因为我不知道监视和释放自己什么,我完全不知道这种行为会如何影响我的应用程序的性能

在新的用户术语中,在iOS项目中使用ARC时,我应该注意哪些“陷阱”?我在这里读到了一些关于内存管理和ARC的问题,但老实说,它们对新的iOS开发人员并不友好。有人能给出一个合理的要点清单,说明需要注意的问题和问题,以及何时需要自我管理内存的公平指南吗?

  • 循环引用。当对象相互依赖时,它们将泄漏。您需要将某些引用标记为弱引用,仪器可以帮助您定位这些引用。这些泄密甚至不会显示为泄密,因为它们彼此有很强的引用关系

  • 创建自动释放池
    @Autorelease
    ,以便在创建许多自动释放对象(直接或间接)的位置降低自动释放池的大小。具体来说,您的程序和您所依赖的程序将
    自动释放
    许多对象(圆弧或其他)。自动释放的对象是“将来”将被释放的对象。每个Cocoa程序都希望每个线程上都存在一个自动释放池。这就是创建新线程时创建新池的原因,也是在
    main
    中创建新池的原因。池作为堆栈运行-您可以推送和弹出池。当一个池被销毁时,它会将其延迟的
    release
    消息发送给它所持有的每个对象。这意味着具有许多临时分配的真正大的循环可能会导致许多仅由池引用的对象,并且池可能会变得非常大。因此,在某些情况下,您可以直接排空管理池,以尽量减少等待释放和释放的对象数量

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

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

  • 始终遵循NS-API命名约定,以及

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

  • 如果您使用正确的命名和书写风格,ARC将处理您所需要的大部分内容,但也会有一些其他情况。幸运的是,如果您在开发过程中没有意识到这些问题,您仍然可以运行泄漏和僵尸来定位这些问题


如果您是新手,请使用ARC。对于普通应用程序,没有性能问题。如果你的应用程序使用了大量内存(非常大的图像、大量的声音文件等),那么你需要处理这些问题,这与ARC无关,而只是你可以使用的最大内存量。你仍然可以创建引用循环。我不同意这里的“非建设性”关闭原因。这是一个具体的问题,有一个客观的答案,它与更具技术性的问题相对应。这不是征求意见或投票,也不是为了一份不可能包含在一个答案中的开放式材料列表。谢谢你,布拉德。是的,我甚至读过那篇文章,这也是我问这个问题的部分原因。我仍然觉得在Cocoa/iOS/Objective-c/Xcode开发的环境中,我需要进一步的清晰和更大的内存管理意识。我建议谈论“临时”对象而不是“自动释放”对象,因为直接来到ARC的人可能根本不知道什么是自动释放的对象。从技术上讲,“临时”!=“自动释放”,但在大多数情况下,无论哪种方式,建议都是好的。@bjomer好的,谢谢——我试着在一段中解释自动释放池。谢谢你指出这一点。谢谢你发布这篇文章。这是一个很好的开始,我很可能会把它打印出来以方便使用。