Autorelease: использовать всегда, когда вы NARC'ed? - PullRequest
4 голосов
/ 26 мая 2010

Я знаю, что этот вопрос выглядит как обман: я проверил, и это не

Говоря о NARC, автор этого блога говорит : «Лично я хотел бы сразу же автоматически выпустить все, что я NARC-ed, в той же строке». Это полностью противоречит всем примерам, которые я видел на сайте Apple и в книгах, где autorelease используется только тогда, когда объект должен быть возвращен и не может быть выпущен немедленно. В общем, идея заключается в том, что autorelease требует много памяти и может поглотить вашу программу (хотя это делает код чище). От Appress Начало разработки iPhone 3 :

эти объекты могут иметь вредные влияние на память вашего приложения след. Это нормально использовать autorelease, но попробуйте использовать только его когда вам действительно нужно, а не просто сохранить набрав одну или две строки кода.

Я не спрашиваю, хуже ли autorelease, чем явно вызывающий релиз (он есть), а скорее:

В большинстве «нормальных» ситуаций на iPhone, насколько плохо заменить более позднюю версию более ранним авто-выпуском (тем же способом)? Кроме того, в каких ситуациях это было бы абсолютно запрещено делать это?


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

Ответы [ 2 ]

3 голосов
/ 26 мая 2010

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

Использование автоматического выпуска:

for (int i=0;i<1000;i++) {
    NSString *s = [[[NSString alloc] init] autorelease];
}

// at this point, there are 1,000 unreleased string objects in memory

Использование релиза:

for (int i=0;i<1000;i++) {
    NSString *s = [[NSString alloc] init];

    [s release];
}

// at this point, no string objects are "alive"

Как видите, вы должны быть очень осторожны при использовании автоматического выпуска в циклах.

2 голосов
/ 26 мая 2010

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

Хотя это может показаться дорогостоящим (и, безусловно, его сравнивают с прямым сохранением / выпуском), я не думаю, что это даже близко к стоимости, которую могут иметь отметка генерации и сборщик мусора.

Где авто-релиз действительно сияет, во всех ситуациях, когда могут возникать исключения, и нет никакой попытки / ловли вокруг. В таких случаях авто-релиз определенно предпочтительнее прямого выпуска.

Однако существуют ситуации, когда вам следует избегать автоматического выпуска (то же самое относится и к средам, собранным в garabge, где вы также должны попытаться избежать этих ситуаций). Создание временных автоматически выпущенных объектов в цикле, который выполняется огромное количество раз, - это такой сценарий, который создает значительную нагрузку для сборщика мусора или пула автоматического выпуска.

Следует избегать замены выпуска авто-выпуском в рабочих потоках, которые очень просты и могут жить без нагрузки на пул авто-выпуска. Итак, рекомендация такова: всякий раз, когда вы можете избежать этого, вы должны, когда вы не уверены в автоматическом выпуске.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...