【发布时间】:2011-07-08 14:18:59
【问题描述】:
我正在开发一个应用程序,该应用程序将(非常)大的 csv 文件导入 Core Data 以进行捕获。这个过程是这样的:
- 将文件逐行解析成一个充满 NSStrings 的 NSMutableArray
- 在 X 行后,将数组导入 Core Data(这涉及到操作,在某些情况下会创建新的 NSString)
- [NSMutableArray removeAllObjects];
- 冲洗并重复
乍一看,似乎应该在每个循环结束时释放内存。但是,对于大文件,我发现应用程序在发出几个低内存警告后崩溃。运行泄漏工具告诉我大部分内存都被 CFString 对象用完了,据我所知这与 NSString 对象有关(虽然我不知道如何)
我知道 NSString 会尽可能重用,并且它们的行为与涉及内存的其他对象不太一样,尽管我不了解任何细节。如何回收我的 NSString 对象正在使用的内存?
【问题讨论】:
-
在将字符串放入数组之前如何存储它?你能发布你的代码吗?
-
感谢您的建议,它们都是一样的。我已经为我的自动释放对象建立了一个池和/或在适当的情况下使用 init 方法,但该应用程序仍在循环中多次迭代。这对我来说没有意义:因为我在每个循环之间耗尽了我的内存池,所以应该在迭代之间释放内存,对吧?附带说明一下,我已经使用 Leaks 工具确认我的程序中没有内存泄漏,并且我经常对我的代码进行分析以保持状态 - 不过感谢您的建议。
-
我现在得到了更多细节:至少部分内存正在被释放。当我运行将数据插入核心数据(-insertNewObjectForEntityForName:inManagedObjectContext)的代码时,内存似乎正在积累。我相当定期地执行 -save 操作,所以我认为 Core Data 会处理内存不足的情况,但 Core Data 会不会因为不释放内存而导致问题?
-
在这项调查中存在一些问题,但最终自动释放池不起作用的原因是因为代码中存在内存泄漏,Leaks 没有始终如一地发现,并且使用 Build & Analyze 完全没有检测到。
标签: iphone objective-c memory nsstring