как работает пул автозапуска nsautoreleasepool?

<p>насколько я понимаю, все, что создано с помощью<strong> alloc </strong>,<strong> new </strong>или<strong> copy </strong>, должно быть выпущено вручную. например:</p><pre><code>int main(void) { nsstring *string; string = [[nsstring alloc] init]; /* use the string */ [string release]; } </code></pre><p>мой вопрос, однако, разве это не было бы так же верно?</p><pre><code>int main(void) { nsautoreleasepool *pool; pool = [[nsautoreleasepool alloc] init]; nsstring *string; string = [[[nsstring alloc] init] autorelease]; /* use the string */ [pool drain]; } </code></pre>

<p>да, ваш второй фрагмент кода полностью действителен.</p><p>каждый раз, когда -autorelease отправляется объекту, он добавляется в самый внутренний пул автоматического выпуска. когда пул очищается, он просто отправляет -release всем объектам в пуле.</p><p>автозапуск пулов - это просто удобство, которое позволяет отложить отправку -релизов до «позже». это «позднее» может произойти в нескольких местах, но наиболее распространенным в приложениях gui cocoa является конец текущего цикла цикла выполнения.</p>

<h2>nsautoreleasepool: сток против выпуска</h2><p>поскольку функции <code>drain</code> и <code>release</code>, по-видимому, вызывают путаницу, здесь, возможно, стоит пояснить (хотя это описано в <a href="http://developer.apple.com/documentation/cocoa/reference/foundation/classes/nsautoreleasepool\_class/reference/reference.html#//apple\_ref/occ/instm/nsautoreleasepool/drain">документации</a> ...).</p><p>строго говоря, с точки зрения общей картины <code>drain</code> <em>не</em> эквивалентен <code>release</code>:</p><p>в среде с подсчетом ссылок <code>drain</code> выполняет те же операции, что и <code>release</code>, поэтому оба в этом смысле эквивалентны. подчеркнем, это означает, что вы <em>не</em> пропускаете пул, если используете <code>drain</code>, а не <code>release</code>.</p><p>в среде сборки мусора <code>release</code> не используется. таким образом, это не имеет никакого эффекта. <code>drain</code>, с другой стороны, содержит подсказку сборщику, что он должен «собирать при необходимости». таким образом, в среде сбора мусора использование <code>drain</code> помогает системному сбору баланса.</p>

<p>как уже указывалось, ваш второй фрагмент кода правильный.</p><p>я хотел бы предложить более краткий способ использования пула автоматического выпуска, который работает во всех средах (подсчет ссылок, gc, arc), а также избегает путаницы утечки/выпуска:</p><pre><code>int main(void) { @autoreleasepool { nsstring *string; string = [[[nsstring alloc] init] autorelease]; /* use the string */ } } </code></pre><p>в приведенном выше примере обратите внимание на блок <strong>@autoreleasepool</strong>. это задокументировано <a href="http://developer.apple.com/library/mac/#documentation/cocoa/reference/foundation/classes/nsautoreleasepool\_class/reference/reference.html">здесь</a> .</p>

<p>нет ты ошибаешься. в документации четко указано, что при не-gc -drain эквивалентен -release, что означает, что nsautoreleasepool будет<strong> не </strong>протекать.</p>

<p>я обнаружил, что эта ссылка дала лучшее объяснение того, когда и как использовать nsautoreleasepool: <a href="http://www.cocoadev.com/index.pl?autoreleasepool">autoreleasepool</a> </p>

<p>отправка autorelease вместо релиза объекту продлевает время жизни этого объекта, по крайней мере, до тех пор, пока сам пул не будет слит (может быть дольше, если объект впоследствии будет сохранен). объект может быть помещен в один и тот же пул несколько раз, и в этом случае он получает сообщение о выпуске каждый раз, когда его помещают в пул.</p>

<p>да, ваш код идеален, если вы будете использовать сборщик мусора, этого будет достаточно просто установить строку в ноль, когда вы закончите с ней. сборка мусора плохо влияет на производительность вашего приложения, поэтому я бы не рекомендовал его использовать: p</p>

<p>что я прочитал от apple: "в конце блока пула автоматического выпуска, объектам, которые получили сообщение автоматического выпуска в блоке, отправляется сообщение освобождения - объект получает сообщение освобождения каждый раз, когда ему было отправлено сообщение автоматического выпуска в пределах блок."</p><p> <a href="https://developer.apple.com/library/mac/documentation/cocoa/conceptual/memorymgmt/articles/mmautoreleasepools.html">https://developer.apple.com/library/mac/documentation/cocoa/conceptual/memorymgmt/articles/mmautoreleasepools.html</a> </p>