Работает ли detachNewThreadSelector иначе, чем NSThread executeSelectorInBackground или NSThread alloc / init затем [начало потока] - PullRequest
0 голосов
/ 08 октября 2011

Работает ли detachNewThreadSelector иначе, чем performSelectorInBackground? В моем проекте я использую много этого:

[self performSelectorInBackground:@selector(startImageDownloads:) withObject:[NSNumber numberWithInt:dataType]];

но будет ли это иначе:

[NSThread detachNewThreadSelector:@selector(startImageDownloads:) toTarget:self withObject:[NSNumber numberWithInt:dataType]];

И кроме того, помимо возможности доступа к объекту потока с помощью imgDlThread, он будет выделять / инициализировать поток, тогда start он будет работать иначе, чем первые 2:

NSThread *imgDlThread = [[NSThread alloc] initWithTarget:self selector:@selector(startImageDownloads:) object:[NSNumber numberWithInt:dataType]];
[imgDlThread start];

Спасибо!


Edit:

Только что понял, что на SO уже есть несколько ответов о разнице (или отсутствии) между performSelectorInBackground и detachNewThreadSelector, поэтому я думаю, что мой единственный вопрос:

Распределяет и инициализирует NSThread, затем вызывает [thread start] как-то иначе, чем первые 2?

1 Ответ

1 голос
/ 08 октября 2011

Единственным отличием третьего метода от первых двух является управление памятью. Когда вы выделяете поток, он сохраняет target только для освобождения, когда поток освобожден. Оба метода detatchNewThreadSelector: и performSelectorInBackground: автоматически высвобождают полученный созданный NSThread, что означает, что, как только поток завершит выполнение, target будет освобожден.

В коде, который вы предоставили (выделите поток и запустите его), вы пропускаете imgDlThread, что означает, что target никогда не будет выпущен, и, в свою очередь, будет пропущен сам. Если вы автоматически выпускаете или даже регулярно выпускаете imgDlThread после запуска, это будет иметь тот же эффект, что и detachNewThreadSelector:.

...