iPhone: путаница с NSAutoreleasePool - PullRequest
0 голосов
/ 17 ноября 2011

Я прочитал о NSAutoReleasePool и понимаю, что это облегчает управление памятью на iPhone.Он доступен в NSObject, поэтому сообщение об автоматическом выпуске доступно для каждого экземпляра объекта.Более того, я не должен часто использовать autorelease, так как NSAutoReleasePool использует кэш-память, и вы можете исчерпать память, если имеется много автоматически выпущенных объектов.Правильно ли мое понимание?

Одна вещь, которую я не понял, в чем заключается цель создания NSAutoreleasePool в явном виде, как это делается следующим способом?Какова его цель здесь?Это как выпустить imgData, img объекты автоматически?Потому что я мог видеть, что эти объекты не освобождаются в этом методе.

- (void)loadImage {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
UIImage *img = [UIImage imageNamed: @"default_user.png"];
if(![[imgURL absoluteString] isEqualToString: @"0"]) {
    NSData *imgData = [NSData dataWithContentsOfURL: imgURL];
    img = [UIImage imageWithData: imgData];
}
if([target respondsToSelector: action])
    [target performSelectorOnMainThread: action withObject: img waitUntilDone: YES];
[pool release];
}

Спасибо.

Ответы [ 3 ]

3 голосов
/ 17 ноября 2011

Вы можете использовать локальные пулы автоматического освобождения, чтобы уменьшить пиковую нагрузку на память.Когда ваш пул очищается, временные объекты освобождаются, что, как правило, приводит к их освобождению, тем самым уменьшая объем памяти программы.

Я могу предположить, что этот явный пул автоматического выпуска был создан для управления загрузкой изображений.Вероятно, это изображение имеет большой размер (в Мб), и этот пул может гарантировать, что память будет освобождена как можно скорее.Все пулы с автоматическим выпуском организованы в стек, поэтому этот внутренний пул будет сливаться раньше, чем основной пул.

1 голос
/ 17 ноября 2011

Идея автоматического выпуска - сохранить низкое использование памяти приложением. Вы видите, что если вы не использовали этот автоматический релиз, то эти данные были бы переданы в основной автоматический выпуск приложения. Поэтому даже если вам не нужно это изображение, оно все равно остается в памяти и увеличивает объем занимаемой памяти. Создание нового автоматического релиза сразу же освобождает память. (Размер изображения может быть огромным.)

0 голосов
/ 17 ноября 2011

Правило состоит в том, что вы должны создавать пул автоматического выпуска в каждом потоке, который будет использовать автоматический выпуск. В вашем примере переменная img автоматически высвобождается, и, предполагая, что метод loadImage является многопоточным, вы должны объявить новый пул перед использованием любой автоматически высвобождаемой памяти.

...