Подтвердить что ты не робот

NSAutoreleasePool в NSOperation main?

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

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

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