我在视图控制器中有一个 UIWebView,它有以下两种方法。问题是,如果我在第二个线程完成之前弹出(重新点击导航栏)此控制器,应用程序将在 [super dealloc] 之后崩溃,因为“尝试从主线程以外的线程获取 Web 锁或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];
}
我有相同的解决方案,其中后台线程是最后一个版本,导致视图控制器的释放在后台线程中发生,最终导致相同的崩溃。
以上[[self retain] autorelease]
仍然会导致最终释放发生在后台线程的自动释放池中。 (除非自动释放池中的释放有什么特殊之处,否则我很惊讶这会产生影响)。
我发现这是我的理想解决方案,将此代码放入我的视图控制器类中:
- (oneway void)release
{
if (![NSThread isMainThread]) {
[self performSelectorOnMainThread:@selector(release) withObject:nil waitUntilDone:NO];
} else {
[super release];
}
}
这确保了release
我的视图控制器类的方法始终在主线程上执行。
我有点惊讶的是,某些只能从主线程正确释放的对象还没有内置这样的东西。哦,好吧......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)