NSThread и объект сохраняют количество проблем - PullRequest
4 голосов
/ 19 февраля 2009

Я хочу иметь возможность вызывать метод объекта в новом потоке; но я запутался в том, как управлять счетами удержания (или даже если это проблема).

В не поточном сценарии я бы сделал это:

MyObject *newObject = [[MyObject alloc] init];
[newObject doSomething];
[newObject release];

В этом сценарии все хорошо. Тем не менее, мой вопрос заключается в том, является ли следующая версия с резьбой является проблемой:

MyObject *newObject = [[MyObject alloc] init];
[NSThread detachNewThreadSelector:@selector(doSomething)
                         toTarget:newObject
                       withObject:nil];
[newObject release];

В этом случае, стоит ли мне беспокоиться о том, что newObject будет выпущено во время обработки -doSomething? Если ответ да, то кажется, что -doSomething сохранить self.

кажется грязным

Это проблема? И если да, то каково правильное решение?

Ответы [ 3 ]

9 голосов
/ 19 февраля 2009

Из документов API Xcode:

Объекты aTarget и anArgument сохраняются во время выполнения отдельного потока, а затем освобождаются. Отсоединенный поток завершается (используя метод класса выхода), как только aTarget завершил выполнение метода aSelector.

Итак, то, как вы закодировали это хорошо. Вы можете и должны выпустить newObject.

2 голосов
/ 19 февраля 2009

Как уже говорили другие, ваш код в порядке, так как +detachNewThreadSelector:toTarget:withObject: сохраняет цель. Однако я должен указать на проблему в вашей терминологии. Вам не нужно беспокоиться о том, что «newObject» будет «освобожден» во время потока (фреймворки могут свободно сохранять и освобождать любые объекты сколько угодно, до тех пор, пока вызовы сбалансированы), а вместо этого беспокоиться о том, чтобы он был «освобожден». Ваш код будет почти наверняка освобождать 'newObject' во время работы потока, но он не будет освобожден.

0 голосов
/ 19 февраля 2009

detachNewThreadSelector сохраняет и aTarget (newObject выше) и anArgument (ноль выше), пока выполняется поток, затем освобождает их перед выходом из потока.

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