2009-11-14 69 views
1

我从NavigationController的子视图调用NSOperation。NSOperation performSelectorOnMainThread崩溃

MyOperation *op = [[MyOperation alloc] target:self action:@selector(didFinishOperation)]; 

的操作从一个服务器加载一些数据,分析它,然后当工作完成发送

[target performSelectorOnMainThread:action withObject:nil waitUntilDone:YES]; 

。这通常是工作...

问题是,当我从导航控制器按下后退按钮,而NSOperation正在做它的工作,应用程序崩溃,因为该操作引用一个释放实例。

我试图保持操作 - 但它仍然崩溃...

在此先感谢

回答

0

在你的UIView dealloc方法,你可以取消操作并从其NSOperationQueue将其删除。

4

Chris在正确的轨道上,但它并没有涵盖当您试图取消它时操作完成的情况,它仍然会崩溃。如果操作在main中执行,取消将不会生效。

尽管如此,在你的目标被销毁之前尝试并取消它,但在试图发送消息之前测试target仍然存在。此外,检查,如果你取消尝试发送邮件之前:

if (self.isCancelled) return; 
+0

我已经取消viewWillDisappear操作: [operationQueue cancelAllOperations] 加载视图时,我运行了多个操作。 正如你上面提到的 - 这将取消操作,但不是如果它在主要执行。 我试过了: if(target) [target performSelectorOnMainThread:action withObject:nil waitUntilDone:YES]; 但仍然发生错误... – abs 2009-11-14 08:26:40

+0

我刚刚检查了我的代码,我的操作在尝试通知其目标之前检查它们是否被取消。 – ohhorob 2009-11-14 08:48:04

+0

感谢ohhorob, 做了这个工作:) – abs 2009-11-14 08:55:32