【问题标题】:Objective-C @autoreleasepool?目标-C @autoreleasepool?
【发布时间】:2013-07-20 13:35:27
【问题描述】:

我对 Obj-C 还很陌生,并且刚刚开始制作一些无用的程序来帮助我进一步了解。我想确保我没有造成任何内存泄漏。当程序结束时,'@autoreleasepool' 中的任何内容会自动释放它的内存吗?

另外如果有什么不好的习惯,请告诉我!

int main(int argc, const char * argv[])
{
    @autoreleasepool {

        Fraction* fractionOne = [[Fraction alloc]init];
        Fraction* fractionTwo = [[Fraction alloc]init];
        Fraction* fractionThree = [[Fraction alloc]init];

        [fractionOne setTo:1 over:2];
        [fractionTwo setTo:1 over:4];
        [fractionThree setTo:1  over:8];

        [Fraction numberOfFractions];

        return 0;
    }
}

【问题讨论】:

    标签: objective-c memory-leaks


    【解决方案1】:

    这或多或少是它的作用。但不用担心:只需要依靠 ARC。它为你管理你的记忆!

    使用 ARC,您唯一能真正看到 @autoreleasepool 的地方就是 main 函数。当您开始制作应用程序时,您将在其他地方编写代码,并且几乎不会编辑“默认”主函数(由 Xcode 模板提供给您)。

    所以不用担心!你的代码很好:)

    【讨论】:

    • 不,这只是我用来制作类方法的一种方法。它记录分数对象的数量。感谢您的回复!
    • ARC 不会“为您[管理]您的内存”,并且认为这可能会导致难以调试内存泄漏/崩溃。
    • 您管理它的程度是使用“= nil”(并考虑一般的内存),但我的意思是您不能显式释放内存。作为初学者,不必太担心记忆。当您开始制作应用程序时,您要做的最大事情就是担心是否进行强/弱属性引用。我已经让 ARC 来做这件事,到目前为止我还没有遇到任何问题。
    【解决方案2】:

    启用 ARC 后,会在编译时添加代码以显式释放分数一、二和三,因此它们将随 ARC 一起发布。如果没有 ARC,alloc 将创建 Fraction 的保留实例,并且您的代码既没有显式发布(几乎总是更好),也没有将它们设置为自动发布(几乎总是更糟)。

    因此,如果没有弧,您会在程序运行的几毫秒内泄漏。

    【讨论】:

    • 好的,所以@autoreleasepool 仅在 ARC 开启的情况下可用?假设我没有打开它,我将如何释放内存?即使 ARC 开启,仍然可以释放它吗?
    • 当你像你一样声明它时它是on,但在ARC处理代码时用得不多。启用 ARC 后,您无需执行显式释放、自动释放。编译器不会让你。
    【解决方案3】:

    请参阅 Apple 在高级内存管理编程指南中对Using Autorelease Pool Blocks 的讨论。

    简而言之,不,不是“程序结束时@autoreleasepool 中的任何内容都会自动释放[s] 其内存”(或者至少不是@autoreleasepool 的函数)。拥有自动释放池的目的是控制何时从自动释放项中回收内存,即何时将池耗尽。但是您的代码示例似乎没有使用任何自动释放的项目,因此它在这里并不适用(除非方法在内部使用了自动释放对象)。

    自动释放池最常见的用途是减少应用的内存高水位线。见Use Local Autorelease Pool Blocks to Reduce Peak Memory Footprint。以前是used for thread programming,但是现在我们有了操作和调度块,我们就不用再写传统的线程代码了,所以在我们的多线程代码中没有那么多场合需要单独的自动释放池了。

    【讨论】:

      【解决方案4】:

      自动释放池对象本质上是运行时的一个容器,它在内存中保持对象(所谓的自动释放对象)处于活动状态,直到它们被释放,即当池被耗尽时。这将在 autorelease 的范围结束时发生。

      自动释放池是 Objective-C 中手动引用计数 (MRC) 技术的一部分,用于管理对象的生命周期。 MRC 是三种内存管理模型之一,另外两种是 Automatic Garbage Collection 和 ARC(Automatic Reference Counting)。

      在运行时,我们希望避免内存泄漏。这些是分配的内存块(例如对象),它们曾经是活动的,但不再被任何进程引用。如果我们无法通过任何其他运行代码访问或释放它们,它们可能会产生许多问题,例如混乱并减少可用内存量。自动释放池的概念有助于降低这种风险。

      参考资料:

      1. NSAutoreleasePool
      2. Objective-C 编程,Stephen G. Kochan 的第六版 (2013)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-23
        • 1970-01-01
        • 2011-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-11
        相关资源
        最近更新 更多