Advanced Memory Management Programming Guide говорит о @autoreleasepool:Нужна помощь в отношении @autoreleasepool
Использование местных Autorelease Бассейн блоков для снижения пиковых памяти Footprint
Многие программы создают временные объекты, которые autoreleased. Эти объекты добавляют к области памяти программы до конца блока . Во многих ситуациях, позволяя временным объектам накапливать до конца текущей итерации цикла событий, не приводит к избыточным накладным расходам ; в некоторых ситуациях, однако, вы можете создать большое количество временных объектов, которые существенно добавляются в память , и что вы хотите избавиться быстрее. В последних вы можете создать свой собственный блок пула авторезистов. На конце блока временные объекты освобождаются, что обычно приводит к их освобождению, тем самым уменьшая память программы .
В следующем примере показано, как вы можете использовать локальный пул автозапуска в цикле for.
NSArray *urls = <# An array of file URLs #>;
for (NSURL *url in urls) {
@autoreleasepool {
NSError *error;
NSString *fileContents = [NSString stringWithContentsOfURL:url
encoding:NSUTF8StringEncoding error:&error];
/* Process the string, creating and autoreleasing more objects. */
}
}
Может ли этот код также может быть написана без autoreleasepool и эффективно управлять?
как создание property of fileContents
и установка nil
после обработки.
self.filecontents = nil;
Этого код может быть написан без ARP, как существует ARC в прошивке в настоящее время. – Ashwani
@Ashwin: Насколько я понимаю, пулы автозапуска не зависят от ручного и автоматического подсчета ссылок. Даже с MRP код может быть написан без ARP (просто замените 'fileContents = nil' на' [fileContents release] 'в моем предложенном ниже ответе). –
@Ashwin Это просто неправильно. Формат блока 'autorelease' был введен с ARC. Автореализованные объекты в цикле не будут выпущены до тех пор, пока цикл выполнения не удастся выполнить следующую итерацию (поскольку 'UIKit' запускает каждое событие в блоке' autoreleasepool'), если только не используется 'autoreleasepool'. – danielbeard