В настоящее время я разбираю все мои данные из JSON и сохраняю их в массиве. Однако, когда он начинает разбираться, использование памяти скапливается примерно с 25 МБ до 800 МБ. После выполнения некоторых исследований мне сказали, чтобы поставить @autoreleasepool в блок GCD, но безрезультатно.Использование большой памяти при разборе JSON
Вот код, который я получил до сих пор:
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 или что-то в этом роде.
Если ваш autoreleasepool находится внутри цикла for, вы получите утечку на каждой итерации. Там могут быть лучшие способы разработки этого кода, чтобы избежать памяти, но это может быть быстрым решением. – KirkSpaziani
Он сократил вдвое примерно до 400 мб. Это все еще кажется довольно высоким, хотя –
сколько данных вы разбираете? @autoreleasepool здесь бесполезен (не все ваше приложение под @autoreleasepool?) – Ali