当我加载我的应用程序时,我下载了大约10-15个JSON文件并将它们存储到我的应用程序文档目录中 - 有些范围从几KB到30MB。
一旦完成,我需要从文档dir中获取每个文件,转换为NSDictionary,并解析为NSManagedObjects。
但是,当我使用下面的代码执行此操作时,因为它通过每个JSON似乎将它们保留在内存中,直到应用程序最终崩溃。乐器在“泄漏”工具中没有显示任何内容,但我的应用程序在内存中保留了很多。
下面是抓取JSON文件的代码:
已更新
- (void)parseDownloadedFiles
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
docDir = [docDir stringByAppendingString:@"/jsons"];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *files = [fileManager contentsOfDirectoryAtPath:docDir error:&error];
if (files == nil) {
// error...
}
for (NSString *file in files)
{
NSString *fileName = [NSString stringWithFormat:@"%@/jsons/%@",
docDir, file];
NSString *content = [[NSString alloc] initWithContentsOfFile:fileName
usedEncoding:nil
error:nil];
NSDictionary *JSON =
[NSJSONSerialization JSONObjectWithData: [content dataUsingEncoding:NSUTF8StringEncoding]
options: NSJSONReadingMutableContainers
error: &error];
...create my NSManagedObjects & store
JSON = nil;
}
}
-
看看我的分配:
-
钻进第一个Malloc 44.79带来了这些问题:
- 这是在上面代码的for循环中
NSLog真的会引起这样的问题吗?
答案 0 :(得分:1)
是的,你的getContentFromFile ...方法返回一个保留的字符串。你永远不会在接收端发布它。
您需要在返回时自动释放字符串,或者在将其解析为JSON后显式释放。
(我认为Analyzer会发现这个。)
答案 1 :(得分:1)
你应该在你读取文件的循环中放入@autoreleasepool {}。在方法返回之前,对象不会被释放,因此内存将在循环内部建立。
ARC将通过自动释放对象来帮助您,但您需要它们更快地释放。