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)
| 归档时间: |
|
| 查看次数: |
14105 次 |
| 最近记录: |