多线程ViewController中的UIWebView

Tao*_*Tao 9 iphone cocoa-touch memory-management objective-c uikit

我在viewcontroller中有一个UIWebView,它有两个方法如下.问题是如果我在第二个线程完成之前弹出(点击导航栏)此控制器,应用程序将在[super dealloc]之后崩溃,因为"试图从主线程以外的线程获取Web锁定或这可能是从辅助线程调用UIKit的结果." 任何帮助将非常感激.

-(void)viewDidAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(load) object:nil];
    [operationQueue addOperation:operation];
    [operation release];
}

-(void)load {
    [NSThread sleepForTimeInterval:5];
    [self performSelectorOnMainThread:@selector(done) withObject:nil waitUntilDone:NO];
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*lly 35

我有一个相同的解决方案,其中后台线程是最后一个版本,导致视图控制器的dealloc发生在后台线程中以相同的崩溃结束.

以上[[self retain] autorelease]仍然会导致最终版本从后台线程的自动释放池中发生.(除非有关于自动释放池的发布有什么特别之处,我很惊讶这会产生影响).

我发现这是我理想的解决方案,将此代码放入我的视图控制器类:

- (oneway void)release
{
    if (![NSThread isMainThread]) {
        [self performSelectorOnMainThread:@selector(release) withObject:nil waitUntilDone:NO];
    } else {
        [super release];
    }
}
Run Code Online (Sandbox Code Playgroud)

这确保release了我的视图控制器类的方法总是在主线程上执行.

我有点惊讶的是,某些只能从主线程正确释放的对象还没有内置的东西.哦,好吧......


Emi*_*tar 12

下面是一些在主线程上运行UIKit元素的代码.如果您正在使用其他线程并且需要运行一段UIKit代码,请将其放在此Grand Central Dispatch代码段的括号中.

dispatch_async(dispatch_get_main_queue(), ^{

    // do work here

});
Run Code Online (Sandbox Code Playgroud)