Использование NSThread в этом фрагменте кода - PullRequest
0 голосов
/ 26 января 2012

Я работаю над чужим кодом. Я наткнулся на строку кода

[NSThread detachNewThreadSelector:@selector(myMethod) toTarget:self withObject:nil];

У меня есть 2 вопроса.

  1. Это просто вызов метода. Почему здесь используется NSThread?
  2. Во время выполнения кода, в некоторых случаях этот метод не вызывается. Когда я помещаю точку останова в метод, он всегда вызывается. Но если я удаляю точку останова, в некоторых случаях метод не вызывается. Это проблема NSThread?

Ответы [ 2 ]

3 голосов
/ 26 января 2012

Использование NSThread таким образом означает, что метод "myMethod" вызывается в фоновом потоке одновременно с остальной частью кода.Это эквивалентно тому, что вы, возможно, также видели:

[self performSelectorInBackground:@selector(myMethod) withObject:nil];

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

Если вы скажете:

[NSThread detachNewThreadSelector:@selector(methodA) toTarget:self withObject:nil];
[self methodB];

Тогда methodA и methodB будут одновременно работать , и нет никакой гарантии, что methodA завершит работу перед methodB.

2 голосов
/ 26 января 2012

Я всегда использую NSThread detachNewThreadSelector в сочетании с пулом автоматического выпуска, например:

  -(void)myMethod {
      NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init];
      // .. Do stuff in this thread
      [pool release];
  };

Если вы хотите «просто» выполнить селектор, сделайте это так:

  [self performSelector:@selector(myMethod)];
...