1

我对 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

4 回答 4

4

请参阅 Apple在Advanced Memory Management Programming Guide中对使用自动释放池块的讨论。

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

自动释放池最常见的用途是减少应用程序的内存高水位线。请参阅使用本地自动释放池块来减少峰值内存占用。它曾经用于线程编程,但现在我们有了操作和调度块,我们不再需要编写传统的线程代码,因此我们不再需要在多线程代码中使用单独的自动释放池。

于 2013-07-21T21:47:09.170 回答
0

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

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

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

于 2013-07-21T21:33:26.410 回答
0

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

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

于 2013-07-21T21:34:47.167 回答
0

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

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

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

参考:

  1. NSAutoreleasePool
  2. Objective-C 编程,第六版 (2013),Stephen G. Kochan
于 2019-03-27T18:15:49.607 回答