NSAutoreleasePool в NSOperation основной? - PullRequest
25 голосов
/ 08 октября 2008

Документация для +[NSThread detachNewThreadSelector:toTarget:withObject:] гласит:

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

У меня вопрос: нужно ли мне создавать свой собственный NSAutoreleasePool в переопределении метода -[NSOperation main], или создание NSAutoreleasePool обрабатывается NSOperation?

Ответы [ 5 ]

14 голосов
/ 05 февраля 2010

Хороший вопрос, даже собственные документы Apple и пример кода не очень ясны по этому поводу. Я думаю, что нашел ответ, хотя:

Поскольку операции выполняются в Objective-C объекты, вы всегда должны создавать Авто-релиз бассейн в начале реализация кода вашей задачи. Авто-релиз бассейн обеспечивает защиту против утечки Objective-C объекты, которые автоматически высвобождаются во время выполнение вашей задачи. Хотя там может быть уже пул на месте время выполнения вашего пользовательского кода, Вы никогда не должны полагаться на это поведение и всегда должен предоставлять свой.

По сути, хотя, как упоминал Дэвид, может быть, есть пул, вы все равно должны создать свой собственный.

12 голосов
/ 09 октября 2008

Да, вы делаете. Вы определяете автономную часть работы, которую NSOperationQueue будет выполнять в «некотором» потоке, поэтому вы несете ответственность за управление памятью в этой части.

6 голосов
/ 02 декабря 2008

Вам не нужно создавать свой собственный NSAutoreleasePool в вашем основном, система сделает это за вас. Чтобы увидеть это, используйте команду меню Xcode Run> Show> Breakpoints, чтобы открыть окно Breakpoints и введите: - [NSAutoreleasePool init]

Теперь запустите вашу программу, и вы увидите, что пул автоматического выпуска создается в NSOperation.

См. Также примеры Apple, например, http://developer.apple.com/Cocoa/managingconcurrency.html, которые не создают свой пул автоматического выпуска.

2 голосов
/ 09 октября 2008

Да, вам нужно создать NSAutoreleasePool в вашем методе [NSOperation main], если только вы не создаете "параллельный" (слегка неудачный номенклатурный) подкласс NSOperation и ваш переопределенный метод [NSOperation start] создает NSAutoreleasePool перед вызывая `[NSOperation main].

Документация класса NSOperation содержит хорошее описание всего этого: http://developer.apple.com/documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html.

0 голосов
/ 22 октября 2009

да, вам нужно.

- (void) main
{
  NSAutoreleasePool *thePool = [[NSAutoreleasePool alloc] init];
  //your code here
  //more code
  [thePool release];
}

если вы не создадите пул авто-выпуска, любой инициализатор класса удобства (например, [NSString stringWithFormat:]) утечет, так как эти инициализаторы возвращают автоматически выпущенные объекты.

...