Cocoa在循环中自动释放

Sir*_*tty 0 memory string cocoa loops

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

在循环中,如何使用便捷方法进行内存管理?我是否需要显式创建自动释放池然后将其排空.或者这一切都是自动化的吗?

例如

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

在这个例子中,我反复从lastPathComponent获取一个新字符串.暂时忽略同一件事中的不良举止,我该如何处理这种记忆管理情况呢?

'componentString'根本没有保留,它只在循环中有生命周期,仅用于与其他字符串进行比较.谢谢你的帮助.

Mar*_*don 6

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

您可以通过实例化和释放新的自动释放池来创建和排空本地自动释放池.

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

如果您创建和释放太多池,则可能会遇到性能损失,因此您可能需要检查特定数量的迭代(例如,每100个循环左右)来创建和释放池.没有固定号码,所以你必须做一些游戏.

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

  • Apple建议您调用[pool drain]而不是release以便将来与垃圾收集兼容,尽管在托管内存应用程序中它们执行相同的操作. (4认同)