@autoreleasepool函数是否可以手动用于内存管理?

时间:2015-12-14 09:09:03

标签: ios objective-c

我目前正在构建一个通过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
    }
}

有没有更好的方法来进行内存管理呢?

1 个答案:

答案 0 :(得分:2)

在生成大量丢弃(自动释放)对象的代码周围放置@autorelease块不仅有效,而且建议使用。这显然也适用于少数大型物体:)

主线程上运行的代码有一个自动释放池可用,但可能还不够。池在runloop的底部排空,如果在单个runloop循环中创建了许多自动释放的对象,则可能需要一个专门用于清理这些对象的池以避免内存不足。这通常发生在循环中,并且建议在这种情况下循环体是@autorelease块。

就您的具体问题而言,一个JSON结构的300MB正在推动它。如果可能的话,你应该尝试将它分解成更小的对象并分别解析它们。