Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c Cocoa应用程序使用的内存比它应该使用的多得多_Objective C_Json_Cocoa_Memory Leaks_Nsmutablearray - Fatal编程技术网

Objective c Cocoa应用程序使用的内存比它应该使用的多得多

Objective c Cocoa应用程序使用的内存比它应该使用的多得多,objective-c,json,cocoa,memory-leaks,nsmutablearray,Objective C,Json,Cocoa,Memory Leaks,Nsmutablearray,我正在开发一个应用程序,可以从API下载和解析大约40k json文件。由于程序的结构,我不会立即解析它们,而是将它们保存在一个NSMutable数组中。每个json大约1KB,其中大多数甚至更少。如果我的计算是正确的,那将产生大约40MB(+一些开销)的分配内存。但当我运行这个应用程序时,内存使用量会上升到4GB以上 我在这里漏什么东西吗?因为我使用垃圾收集,所以我不需要释放任何东西,对吗?还是我的计算完全错了 这是我的代码: - (void) loadItemsForIds:(NSArray

我正在开发一个应用程序,可以从API下载和解析大约40k json文件。由于程序的结构,我不会立即解析它们,而是将它们保存在一个NSMutable数组中。每个json大约1KB,其中大多数甚至更少。如果我的计算是正确的,那将产生大约40MB(+一些开销)的分配内存。但当我运行这个应用程序时,内存使用量会上升到4GB以上

我在这里漏什么东西吗?因为我使用垃圾收集,所以我不需要释放任何东西,对吗?还是我的计算完全错了

这是我的代码:

- (void) loadItemsForIds:(NSArray*)idList {

    for (NSNumber* n in idList) {
        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://someapi.com/somejson.json?id=%@", n]];
        NSData* response = [NSData dataWithContentsOfURL:url];
        NSDictionary *loadedData = [NSJSONSerialization JSONObjectWithData:response options:0 error:nil];

        @synchronized(self.updateData) {
            [self.updateData addObject:loadedData];
        }

        [self performSelectorOnMainThread:@selector(progressLoadingInterface:) withObject:[loadedData valueForKey:@"name"] waitUntilDone:NO];
    };

}
编辑:

如果我不将数据保存到数组中,发现问题甚至存在。经过一些研究,我偶然发现了一个问题,这个问题涉及同样的问题:


我的问题可能需要删除。

[NSJSONSerialization JSONObjectWithData:response options:0 error:nil]
将JSON数据解析为对象。这将比1K的JSON数据占用更多内存

此外,
NSString
可能将所有字符串数据存储为
unichar
,这是一种16位表示:是JSON数据中假定的UTF-8编码大小的两倍

根据JSON的内容,我可以相信1K的JSON数据可以变成10K的对象



但这都是猜测。使用仪器(产品>配置文件)检查内存使用情况。这将使您更好地了解哪些对象占用了所有内存。

在40k次迭代之间,您永远不会释放内存。
=>您也从未给任何人这样做的机会(arc/gc)

@autoreleasepool{…}
中包装循环主体,以便耗尽内存

for (NSNumber* n in idList) {
    @autoreleasepool {
         NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://someapi.com/somejson.json?id=%@", n]];
        NSData* response = [NSData dataWithContentsOfURL:url];
        NSDictionary *loadedData = [NSJSONSerialization JSONObjectWithData:response options:0 error:nil];

        @synchronized(self.updateData) {
            [self.updateData addObject:loadedData];
        }

        [self performSelectorOnMainThread:@selector(progressLoadingInterface:) withObject:[loadedData valueForKey:@"name"] waitUntilDone:NO];
    }
}

当使用工具进行评测时,一切似乎都很好,3000个json对象之后有37MB的持久字节,这很好。但是,只要我不使用仪器就尝试使用它,内存使用率就会高得多(3000个对象后大约181MB),我不明白垃圾收集是怎么回事?或者只是一个可能的复制品没有起作用。。另外:我认为ARC会自动释放循环末尾分配的内存?是的,但如果没有池,内存会一直上升,只有在所有迭代之后才会释放。那么您的对象确实有那么大:D配置文件对象有多大