2008-10-08 2 views
25

Документация +[NSThread detachNewThreadSelector:toTarget:withObject:] говорит:NSAutoreleasePool в NSOperation main?

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

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

ответ

12

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

2

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

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

6

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

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

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

+0

Я думаю, что вам нужно, если они не являются mainThread NSOperations, на основе других комментариев здесь. – mxcl 2011-02-10 18:50:20

0

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

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

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

+0

В соответствии с документацией Apple вы не должны вызывать выпуск для autoreleasePool, вы должны вызвать дренаж. – 2012-03-13 09:19:34

14

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

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

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

Смежные вопросы