(我已经阅读了Apple的内存管理指南,以及其他内存管理帮助,但我仍然对以下内容感到困惑)
我应该如何在循环中使用便捷方法进行内存管理?我是否需要显式创建自动释放池然后将其排空。或者这一切都是自动化的吗?
e.g。
for (i=0; i<numFilePaths; i++) {
// ...
NSString *componentString = [someString lastPathComponent];
// ...
}
在这个例子中,我反复从lastPathComponent获取一个新字符串。暂时忽略同一件事中的不良举止,我该如何处理这种记忆管理情况呢?
'componentString'根本不被保留,它仅在循环内具有生命周期,仅用于与其他字符串进行比较。谢谢你的帮助。
答案 0 :(得分:6)
自动释放池仅在运行循环结束时耗尽,通常在控件返回给用户的方法结束时耗尽。如果您发现自己多次运行循环会导致创建大量自动释放的对象(这将在内存中构建,直到您的方法结束),您可能需要创建一个本地自动释放池并自行排空。 / p>
您可以通过实例化并释放新的自动释放池来创建和排空本地自动释放池。
for (i=0; i<10000; i++) {
NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];
NSString *aString = [NSString string];
[pool drain];
}
如果您创建和释放太多池,可能会有性能损失,因此您可能需要检查特定数量的迭代(比如每100个循环左右)来创建和释放池。没有固定号码,所以你必须做一些游戏。
更新:将[pool release]
更新为[pool drain]
,以便在将来与Marc Charbonneau建议的垃圾收集兼容。