【问题标题】:Cocoa Autoreleasing in loops循环中的 Cocoa 自动释放
【发布时间】:2009-05-12 01:56:26
【问题描述】:

(我已经阅读了 Apple 的内存管理指南,以及这里的其他内存管理帮助,但仍然对以下内容感到困惑)

我应该如何使用循环中的便捷方法进行内存管理?我是否需要显式创建一个自动释放池然后将其耗尽。还是这一切都是自动的?

例如

for (i=0; i<numFilePaths; i++) {
    // ...
    NSString *componentString = [someString lastPathComponent];
    // ...
}

在此示例中,我反复从 lastPathComponent 获取新字符串。暂时忽略同一件事中的不礼貌,我应该如何处理这种内存管理情况?

'componentString' 根本不保留,它仅在循环内有生命周期,仅用于与其他字符串进行比较。感谢您的帮助。

【问题讨论】:

    标签: cocoa memory string loops


    【解决方案1】:

    自动释放池只有在运行循环结束时才会被耗尽,通常是在方法结束时,当控制权返回给用户时。如果您发现自己多次运行循环,这将导致创建大量自动释放对象(这些对象将在内存中累积,直到您的方法结束),您可能需要创建一个本地自动释放池并自己排空它。

    您可以通过实例化和释放一个新池来创建和耗尽本地自动释放池。

    for (i=0; i<10000; i++) {
      NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];
      NSString *aString = [NSString string];
      [pool drain];
    }
    

    如果创建和释放太多池,可能会影响性能,因此您可能需要检查一定数量的迭代(例如每 100 个循环左右)来创建和释放池。没有固定的数字,所以你必须玩一些。

    更新:将 [pool release] 更新为 [pool drain],以保持未来与 Marc Charbonneau 建议的垃圾收集的兼容性。

    【讨论】:

    • Apple 建议您调用 [pool drain] 而不是 release 以便将来与垃圾收集兼容,尽管在托管内存应用程序中它们会做同样的事情。
    • 您不想将 NSAutoreleasePool 调用放在 for 循环之外吗?
    • @Mark - 这会破坏这里的目的......问题在于有一个大循环,你想更积极地释放内存。我更喜欢在这样的循环中使用专门分配的实例(如果可以的话),并在循环结束时释放它们,因为它的性能更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 2011-06-24
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    相关资源
    最近更新 更多