Зачем использовать NSAutoreleasePool? - PullRequest
9 голосов
/ 07 сентября 2010

Рассмотрим следующую программу:

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    // Insert code here... 
    NSLog(@"Programming is Fun !"); 
    [pool drain]; 
    return 0;
}

Я не понимаю, почему там требуется pool, так как эта же программа может быть написана так:цель использования пула авто релизов?Зачем и когда они нам нужны?Являются ли они обязательными в каждой целевой программе C?

Если я не хочу автоматически освобождать какой-либо объект, нужно ли мне также использовать пул автоматического освобождения?

Ответы [ 6 ]

8 голосов
/ 07 сентября 2010

Но если я не хочу автоматически освобождать какой-либо объект, тогда мне также нужно использовать пул автоматического освобождения?

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

7 голосов
/ 07 сентября 2010

NSObject содержит аккуратную функцию с именем autorelease. Это означает, что все объекты в Objective-C содержат эту функцию.

Эта функция вставляет self в пул автоматического выпуска, задерживая вызов функции release объекта до тех пор, пока пул автоматического выпуска не будет освобожден. Большинство внутренних API-интерфейсов используют пул автоматического выпуска, и кроме того, который расположен в main(), в каждом проходе есть один выделенный и освобожденный в основном цикле UIKit.

Короче говоря: это очередь для отложенного уменьшения счетчика ссылок.

Пример того, где скрыт автоматический выпуск:

[NSString stringWithUTF8String:"some string"];

Этот объект выделен, и для него вызывается авто-релиз. Как бы вы использовали это сами?

MyObject *obj = [[[MyClass alloc] init] autorelease];

Почему это хорошо? Когда вы возвращаете этот объект, вызывающей функции не нужно заботиться о том, чтобы освободить этот объект, и при желании он может сохранить его (но не обязан).


Чтобы расширить и уточнить четыре года спустя:

В то время как UIKit и AppKit создают и истощают NSAutoreleasePool во время их основного цикла выполнения, в вашей программе без графического интерфейса вам нужно создать его самостоятельно. Различный код ожидает наличия NSAutoreleasePool подарка, и, поскольку вы не инициализировали структуру GUI и не использовали ее, нет кода, который волшебным образом создаст его для вас.

В то время как NSLog() и константа NSString в вашем примере не требуют пула, даже тривиальный [NSMutableArray array] требует, учитывая, что он действительно может интерпретироваться как [[[NSMutableArray alloc] init] autorelease].

2 голосов
/ 10 ноября 2014

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

  • Если вы пишете программу, не основанную на инфраструктуре пользовательского интерфейса, например инструмент командной строки.

  • Если вы пишете цикл, который создает много временных объектов - вы можете использовать блок пула автоматического освобождения внутри цикла, чтобы избавиться от этих объектов перед следующей итерацией.Использование блока пула автоматического выпуска в цикле помогает уменьшить максимальный объем памяти приложения.

  • Если вы создаете вторичный поток - вы должны создать свой собственный блок пула автоматического выпуска, как толькопоток начинает выполняться;в противном случае ваше приложение будет пропускать объекты.

1 голос
/ 07 сентября 2010

Я нашел причину ... "Если пул недоступен, автоматически освобожденные объекты не освобождаются, и вы теряете память. В этой ситуации ваша программа обычно регистрирует подходящие предупреждающие сообщения."

0 голосов
/ 07 сентября 2010

Общее введение можно найти на веб-сайте Apple:

0 голосов
/ 07 сентября 2010

Ознакомьтесь с NSAutoreleasePool Документация

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