Как часть приложения, которое позволяет аудиторам создавать находки и связывать с ними фотографии (сохраненные как строки Base64 из-за ограничений на веб-службу), я должен выполнить все выводы и их фотографии в рамках аудита и установить для их значения синхронизации значение true.Цель C Для циклов с @autorelease и ARC
Пока я выполняю этот цикл, я вижу всплеск памяти, скачущий со скоростью от 40 МБ до 500 МБ (примерно для 350 фотографий и 255 выводов), и это число никогда не опускается. В среднем наши пользователи создают около 1000 результатов и 500-700 фотографий, прежде чем пытаться использовать эту функцию. Я попытался использовать пулы @autorelease, чтобы сохранить память, но она, похоже, не будет выпущена.
for (Finding * __autoreleasing f in self.audit.findings){
@autoreleasepool {
[f setToSync:@YES];
NSLog(@"%@", f.idFinding);
for (FindingPhoto * __autoreleasing p in f.photos){
@autoreleasepool {
[p setToSync:@YES];
p = nil;
}
}
f = nil;
}
}
Взаимосвязи и сохраняющие циклы выглядеть следующим образом
аудита имеет сильную ссылку Поиск
Finding имеет слабую ссылку на AUDIT и сильная ссылка на FindingPhoto
FindingPhoto имеет слабое указание на поиск
Что мне не хватает в плане возможности эффективного прохода этих объектов и устанавливают их свойства, не вызывая такого огромного всплеска в памяти. Я предполагаю, что это связано с тем, что многие строки Base64 загружаются в память при прохождении цикла, но никогда не выпускаются.
Как хранятся и загружаются эти объекты? Они не будут автореализоваться, потому что они все еще сохраняются в массивах, которые вы повторяете ... – Wain
Сохраняется в основных данных и загружается с использованием NSFetchRequests в MutableArray. Есть ли лучший способ загрузить их, чтобы загружать и выпускать по одному, поскольку это приводит к сбою приложения, если их слишком много. –
Я должен упомянуть, что единственным выполняемым FetchRequest является объект в объекте Audit, остальные доступны через свои отношения, которые явно не загружены. –