0

当我加载我的应用程序时,我下载了大约 10-15 个 JSON 文件并将它们存储到我的应用程序文档目录中——有些从几 KB 到 30MB 不等。

完成后,我需要从文档目录中获取它们中的每一个,转换为 NSDictionary,然后解析为 NSManagedObjects。

但是,当我使用下面的代码执行此操作时,当它通过每个 JSON 时,它似乎将它们保留在内存中,直到应用程序最终崩溃。Instruments 在“泄漏”工具中没有显示任何内容,但我的应用程序在内存中保留了大量内容。

下面是获取 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 真的会导致这样的问题吗?

4

2 回答 2

1

是的,您的 getContentFromFile... 方法正在返回一个保留的字符串。而且你永远不会在接收端释放它。

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

(我认为 Analyzer 会发现这一点。)

于 2013-02-01T22:12:28.360 回答
1

您应该将 @autoreleasepool {} 放在读取文件的那个循环中。在方法返回之前,对象不会被释放,因此内存将在循环内累积。

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

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

于 2013-02-02T00:16:42.857 回答