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