Objective-C NSThread соглашение о подсчете ссылок (сохранить против autorelease) - PullRequest
3 голосов
/ 11 января 2010

Моя основная программа порождает поток, который выполняет следующее:

// alloc autorelease pool somewhere before
NSArray *blah = [NSArray arrayWithObject: @"moo"];
[self performSelectorOnMainThread: @selector(boonk:) withObject: blah
      waitUntilDone: NO];
// release autorelease pool somewhere after

Теперь это мне кажется ошибочным, потому что пул автоматического выпуска может быть освобожден до того, как завершится выполнение селектора boonk: что приведет ксбой.

Итак, мой следующий естественный ход будет:

// alloc autorelease pool somewhere before
NSArray *blah = [[NSArray alloc] initWithObject: @"moo"];
[self performSelectorOnMainThread: @selector(boonk:) withObject: blah
      waitUntilDone: NO];
// release autorelease pool somewhere after


- (void)boonk: (id)data
{
   // do something with data
   [data release];   // release the ref count the thread added
}

Это определенно без ошибок, но .... кажется неестественным.Существует ли соглашение или протокол подсчёта объективных значений c для обработки этой ситуации (межпотоковая публикация без ожидания) или второе решение выше способа, которым это делается?

Ответы [ 2 ]

9 голосов
/ 11 января 2010

На самом деле, performSelectorOnMainThread сохраняет свои аргументы до тех пор, пока после не будет выполнен селектор, поэтому в этом нет необходимости

3 голосов
/ 11 января 2010

Правило простое; чтобы передать объект из потока A в поток B, должно существовать жесткое сохранение. Теперь, как задокументировано, -performSelectorOnMainThread: (и варианты) do сохраняют объекты до завершения выполнения метода, независимо от синхронного или асинхронного вызова.

Однако , как правило, целесообразно поддерживать мотив «оставляю при отправке нить, которая освобождается при получении нити». Он явно задуман и будет поддерживать будущие рефакторинги, потенциально для других моделей, которые не выполняют автоматическое сохранение / освобождение.

И, повторяю, потому что это важно, пулы автоматического выпуска нельзя использовать для сохранения объектов в потоках.

...