背景线程上的dealloc

Mar*_*ett 5 iphone memory-management objective-c

从后台线程调用dealloca 是错误的UIViewController吗?似乎UITextView(可以?)最终调用_WebTryThreadLock哪个导致:

bool _WebTryThreadLock(bool):试图从主线程或Web线程以外的线程获取Web锁.这可能是从辅助线程调用UIKit的结果.

背景:我有一个子类NSOperation,它接受一个selector和一个target对象通知.

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

-(void)dealloc {
   [_target release];
   [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

如果在UIViewController开始NSOperation运行时已经被解雇,那么调用将在后台线程上release触发它dealloc.

Gab*_*ada 9

是的,在后台线程(或队列)中释放UIViewController是一个错误.在UIKit中,dealloc不是线程安全的.这在Apple的TN2109 doc中有明确说明:

当辅助线程保留目标对象时,必须确保线程在主线程释放其对象的最后一个引用之前释放该引用.如果不这样做,则辅助线程将释放对象的最后一个引用,这意味着对象的-dealloc方法在该辅助线程上运行.如果对象的-dealloc方法执行在辅助线程上不安全的事情,这是有问题的,这对于像视图控制器这样的UIKit对象是常见的.


Dav*_*har 6

简单的规则是在后台线程上执行任何操作都是错误的UI*.

  • 调用performSelectorOnMainThread是正常的方法:如果你想从后台线程操作UI. (2认同)