Ответ 1
Да, да. Вы определяете самостоятельную часть работы, которую NSOperationQueue будет выполнять на "некотором" потоке, поэтому вы ответственны за управление памятью в этой части.
В документации для +[NSThread detachNewThreadSelector:toTarget:withObject:]
указано:
Для приложений, не связанных с мусором, отвечает метод
aSelector
для создания пула автозапуска для недавно отделившейся нити и освобождения этот пул до его выхода.
Мой вопрос: мне нужно создать свой собственный NSAutoreleasePool
в моем переопределении метода -[NSOperation main]
или создать NSAutoreleasePool
, обработанный NSOperation
?
Да, да. Вы определяете самостоятельную часть работы, которую NSOperationQueue будет выполнять на "некотором" потоке, поэтому вы ответственны за управление памятью в этой части.
Хороший вопрос, даже собственные документы Apple и примерный код не совсем понятны. Я считаю, что нашел ответ, хотя:
Поскольку операции Objective-Cобъектов, вы всегда должны создавать автореферат в начале реализация вашего кода задачи. автореферат обеспечивает защиту против утечки Objective-Cобъекты, которые автореализовываются во время выполнение ваших задач. Хотя там может уже быть пулом на месте время выполнения вашего пользовательского кода, вы никогда не должны полагаться на это поведение и должен всегда предоставлять свои собственные.
В принципе, несмотря на то, что, по словам Дэвида, может быть пул, вы все равно должны создать свой собственный.
Вам не нужно создавать свой собственный NSAutoreleasePool в своей основной части, система делает это за вас. Чтобы увидеть это, используйте команду меню Xcode Run > Show > Breakpoints, чтобы открыть окно Breakpoints и введите: - [NSAutoreleasePool init]
Теперь запустите свою программу, и вы увидите, что в NSOperation создается пул автозаполнения.
См. также примеры Apple, например http://developer.apple.com/Cocoa/managingconcurrency.html, которые не создают свой собственный пул автоопределений.
Да, вам нужно создать NSAutoreleasePool
в вашем методе [NSOperation main]
, если вы не создаете подкласс "concurrent" (немного неудачная номенклатура) NSOperation
, и ваш переопределенный метод [NSOperation start]
создает NSAutoreleasePool
до вызов `[NSOperation main].
Документация класса NSOperation
имеет хорошее описание всего этого:
http://developer.apple.com/documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html.
да, вам нужно.
- (void) main
{
NSAutoreleasePool *thePool = [[NSAutoreleasePool alloc] init];
//your code here
//more code
[thePool release];
}
если вы не создаете пул автоопределений, любой инициализатор класса удобства (например, [NSString stringWithFormat:]) будет протекать, поскольку эти инициализаторы возвращают объекты с автореализацией.