Objective-C @autoreleasepool?

时间:2013-07-21 21:20:11

标签: objective-c memory-leaks

我是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;
    }
}

4 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

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

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

所以不要担心!你的代码没问题:)

答案 2 :(得分:0)

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

所以没有弧线,你在这个程序运行的几毫秒内就会泄漏。

答案 3 :(得分:0)

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

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

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

参考文献:

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