我正在开发一个将(非常)大型csv文件导入Core Data以进行捕获的应用程序。这个过程是这样的:
乍一看,看起来应该在每个周期结束时释放内存。但是,对于大文件,我发现应用程序在发出几个低内存警告信号后崩溃。运行泄漏工具告诉我CFString对象正在耗尽大部分内存,我理解这些对象与NSString对象有关(虽然我不知道如何)
我知道NSString会尽可能重用,并且它们的行为与其他涉及内存的对象完全不同,尽管我不了解任何细节。如何回收我的NSString对象正在使用的内存?
答案 0 :(得分: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已经说过,你需要减少内存占用的是嵌套的自动释放池。作为第一步,修改您的算法,如下所示:
如果这没有帮助,或者只是帮助一点,请考虑将解析与自动释放池括起来。
答案 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];