如何通过大量NSStrings保持较低的内存使用率,或者如何释放NSStrings?

时间:2011-03-04 06:00:07

标签: iphone objective-c memory nsstring

我正在开发一个将(非常)大型csv文件导入Core Data以进行捕获的应用程序。这个过程是这样的:

  1. 逐行将文件解析为一个充满NSStrings的NSMutableArray
  2. 在X行之后,将数组导入Core Data(这涉及操纵并在某些情况下创建新的NSStrings)
  3. [NSMutableArray removeAllObjects];
  4. 冲洗并重复
  5. 乍一看,看起来应该在每个周期结束时释放内存。但是,对于大文件,我发现应用程序在发出几个低内存警告信号后崩溃。运行泄漏工具告诉我CFString对象正在耗尽大部分内存,我理解这些对象与NSString对象有关(虽然我不知道如何)

    我知道NSString会尽可能重用,并且它们的行为与其他涉及内存的对象完全不同,尽管我不了解任何细节。如何回收我的NSString对象正在使用的内存?

3 个答案:

答案 0 :(得分:2)

我假设您没有内存泄漏。

如果您使用过多的自动释放对象,可能会发生这种情况

您尝试关注

  1. 创建嵌套的自动释放池---有时会发生一些长时间运行的循环,其中累积了自动释放对象。 - 所以添加自定义自动释放池以在需要时释放自动释放对象。

  2. 不要在解析周期中使用autorelease对象---在完成工作后进行手动对象分配和释放。

答案 1 :(得分:2)

  

运行泄漏工具告诉我CFString对象正在耗尽大部分内存,我理解这些对象与NSString对象有关(虽然我不知道如何)

NSString实际上是一个类集群。虽然您认为您正在使用NSStrings,但您几乎肯定会使用其中一个子类。 Cocoa框架根据具体情况选择使用哪个子类。

CFString实际上根本不是一个NSString,它是Core Foundation使用的纯C字符串对象。但是,你会发现它是免费的桥接和#34;到NSString。这意味着,对于Cocoa,它看起来像一个NSString。您看到大量CFString用法的原因是因为您用于获取这些字符串的Cocoa API最终会在Core Foundation中执行其工作。

无论如何,所有这些与你的问题无关,除了事实上,许多CFStrings或多或少意味着与许多NSStrings相同。 Girish已经说过,你需要减少内存占用的是嵌套的自动释放池。作为第一步,修改您的算法,如下所示:

  1. 创建新的自动释放池。
  2. 逐行将文件解析为一个充满NSStrings的NSMutableArray
  3. 在X行之后,将数组导入Core Data(这涉及操纵并在某些情况下创建新的NSStrings)
  4. [NSMutableArray removeAllObjects];
  5. 耗尽自动释放池
  6. 冲洗并重复(从0开始)
  7. 如果这没有帮助,或者只是帮助一点,请考虑将解析与自动释放池括起来。

答案 2 :(得分:0)

您无法确定内存仅由NSStrings使用。我建议你彻底检查一下。尝试去“构建和分析”,它将帮助您找出泄漏。

使用NSString对象时,而不是像

那样使用自动释放的对象
[NSString stringWithFormat@""];

创建自己的对象,并在完成后立即释放它。

NSString * string = [[NSString alloc]initWithFormat:@""];
//use string object
[string release];

这样你可以肯定,你在那里发布了字符串。

或创建自动释放池

NSAutoReleasePool * pool = [[NSAutoReleasePool alloc]init];
// do you coding, creation of objects, releasing them, whatever...
[pool drain]; or [pool release];

另请查看these memory management tips