我目前正在构建一个通过API请求提取大型JSON文件的应用程序。
在下载 - 解码 - 存储数据期间,我收到内存警告(超过500MB)。我找到了一个解决方案,通过手动添加@autoreleasepool { }
功能,避免内存过载并最多保持300MB。
@autoreleasepool {
NSString * result = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&err];//150
decodeData = [[NSData alloc] initWithBase64EncodedString:result options:0];//100
}
@autoreleasepool {
NSString * decodeString = [[NSString alloc] initWithData:decodeData encoding:NSUTF8StringEncoding];//100
NSError * jsonError;
NSData * objectData = [decodeString dataUsingEncoding:NSUTF8StringEncoding];//100
json = [NSJSONSerialization JSONObjectWithData:objectData options:NSJSONReadingMutableContainers error:&jsonError];//50
if(!jsonError){
[defults setObject:json forKey:@"data_object"];//50
}
}
有没有更好的方法来进行内存管理呢?
答案 0 :(得分:2)
在生成大量丢弃(自动释放)对象的代码周围放置@autorelease
块不仅有效,而且建议使用。这显然也适用于少数大型物体:)
主线程上运行的代码有一个自动释放池可用,但可能还不够。池在runloop的底部排空,如果在单个runloop循环中创建了许多自动释放的对象,则可能需要一个专门用于清理这些对象的池以避免内存不足。这通常发生在循环中,并且建议在这种情况下循环体是@autorelease
块。
就您的具体问题而言,一个JSON结构的300MB正在推动它。如果可能的话,你应该尝试将它分解成更小的对象并分别解析它们。