使用NSJSONSerialization在大型for循环中使用ARC的内存问题

时间:2015-10-21 15:13:31

标签: objective-c for-loop memory nsarray nsjsonserialization

我正在尝试创建一个从NSString中进行大量json序列化的函数。

NSArray* array = nil;
NSError* error = nil;
for (NSObject* obj in otherArray) { 
    array = [NSJSONSerialization JSONObjectWithData:[obj.json dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&error];

    // I'm using array here .. and then i don't need it anymore
}

这里我的otherArray可能非常大而且obj.json也是。

但是一段时间后,由于内存问题(> 1GB),应用程序崩溃了。 似乎我的数组永远不会在for循环中dealloc,因为当我评论该行时我没有得到任何错误.. 如何使用ARC释放内存?

由于

1 个答案:

答案 0 :(得分:1)

在循环内使用自动释放池块来减少程序的内存占用:

NSArray* array = nil;
NSError* error = nil;
for (NSObject* obj in otherArray) { 
    @autoreleasepool {
        array = [NSJSONSerialization JSONObjectWithData:[obj.json dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&error];

        // I'm using array here .. and then i don't need it anymore
    }
}
  

许多程序会创建自动释放的临时对象。这些   对象添加到程序的内存占用,直到结束   块。在许多情况下,允许临时对象累积   直到当前事件循环迭代结束才导致   过度开销;但是,在某些情况下,您可以创建一个   大量临时对象大量增加内存   足迹和你想要更快地处置。在这些   在后一种情况下,您可以创建自己的自动释放池块。在   块的结尾,临时对象被释放,这通常是   导致他们的释放,从而减少程序的内存   足迹。

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html#//apple_ref/doc/uid/20000047-SW2