iOS从Documents Dir中有效地解析大型JSON

时间:2013-02-01 21:59:03

标签: ios json ipad memory-management nsjsonserialization

当我加载我的应用程序时,我下载了大约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;
    }  
}

-

看看我的分配: enter image description here

-

钻进第一个Malloc 44.79带来了这些问题:

enter image description here

- 这是在上面代码的for循环中

enter image description here

NSLog真的会引起这样的问题吗?

2 个答案:

答案 0 :(得分:1)

是的,你的getContentFromFile ...方法返回一个保留的字符串。你永远不会在接收端发布它。

您需要在返回时自动释放字符串,或者在将其解析为JSON后显式释放。

(我认为Analyzer会发现这个。)

答案 1 :(得分:1)

你应该在你读取文件的循环中放入@autoreleasepool {}。在方法返回之前,对象不会被释放,因此内存将在循环内部建立。

ARC将通过自动释放对象来帮助您,但您需要它们更快地释放。

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html