我目前正在从JSON解析所有数据并将其存储在数组中。然而,当它开始解析时,内存使用量从大约25mb跳到800mb。在做了一些研究之后,我被告知要在GCD块中放置一个@autoreleasepool,但无济于事。
这是我到目前为止的代码:
self.channelSchedules = [NSMutableArray new];
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Add code here to do background processing
//Loop through each channel object and download schedule
@autoreleasepool {
for (atlas_channel* channel in self.channels) {
NSLog(@"Updating listings for %@", [channel getChannelTitle]);
[self.channelSchedules addObject:[[channel getChannelSchedule] returnCurrentContentObject]];
[self.tableView reloadData];
[self scrollViewDidScroll:nil];
}
}
dispatch_async( dispatch_get_main_queue(), ^{
// Add code here to update the UI/send notifications based on the
// results of the background processing
[self.tableView reloadData];
});
});
我正在使用TouchJSON来解析数据。
经过进一步的研究,我认为这与我将所有值存储在NSArray中并保存在内存中的每个对象的事实有关。我想我将不得不使用CoreData或类似的东西。
答案 0 :(得分:2)
仅在mainThread上调用[self.tableView reloadData]。
答案 1 :(得分:2)
您是否同时从两个线程访问相同的可变数组?那将无法可靠地运作。
正如其他人所说,不要从后台线程更新表。
JSON文件有多大?您实际上是以较低效的方式将所有数据存储在RAM中,因此期望内存使用量是原始文本的两倍。
尝试使用Apple的JSON解析器。
答案 2 :(得分:1)
高内存使用率是因为我将JSON项存储在NSArray中,该NSArray将自身保留在内存中。我能够通过使用realm将我的对象缓存到磁盘并在需要时像EricS建议的那样调用它来解决这个问题。该应用程序现在最多使用32mb,这要好得多。