dealloc на Фоновом потоке

Действительно ли это - ошибка звонить dealloc на a UIViewController от фонового потока? Это кажется этим UITextView (может?) в конечном счете звонят _WebTryThreadLock который приводит к:

bool _WebTryThreadLock (bool): Попробованный для получения веб-блокировки из потока кроме основного потока или веб-потока. Это может быть результатом вызова к UIKit от вторичного потока.

Фон: у Меня есть разделенный на подклассы NSOperation это берет a selector и a target объект уведомить.

-(id)initWithTarget:(id)target {
   if (self = [super init]) {
      _target = [target retain];
   }
   return self;
}

-(void)dealloc {
   [_target release];
   [super dealloc];
}

Если UIViewController был уже отклонен когда NSOperation находит время для выполнения, затем вызов к release триггеры это dealloc на фоновом потоке.

5
задан Mark Brackett 30 April 2010 в 16:47
поделиться

3 ответа

Простое правило состоит в том, что выполнение чего-либо в пользовательском интерфейсе * из фонового потока является ошибкой.

6
ответ дан 18 December 2019 в 07:53
поделиться

Во втором посте здесь была полезная информация, но их ответ не сработал для меня.

UIWebView в многопоточном ViewController

Кажется, это также было решено в iPhone OS 4, но не уверен.

Я закончил тем, что не освобождал свой UIWebView в dealloc контроллера, когда [NSThread isMainThread] был НЕТ. Лучше утечка, чем крах (пока я не найду лучшего решения).

3
ответ дан 18 December 2019 в 07:53
поделиться

Вызов функции dealloc для чего-либо в любое время является ошибкой. Вы должны только когда-либо призывать релиз.

Вы не должны обращаться к каким-либо экземплярам, ​​связанным с пользовательским интерфейсом, из фонового потока. Это включает использование методов получения, потому что они могут изменять вещи внутри. Однако операции сохранения и освобождения являются потокобезопасными для любого объекта в любое время, если соблюдаются обычные правила сохранения и освобождения. Экземпляры, связанные с пользовательским интерфейсом, включают любой объект, на который ссылается активный UIView или UIViewController.

performSelectorOnMainThread не делает ничего, кроме сохранения объекта, пока он не попадет в основной поток. Можно безопасно вызывать любой объект, связанный с пользовательским интерфейсом.

2
ответ дан 18 December 2019 в 07:53
поделиться