虽然导航栏上的切换视图,如何安全退出NSOperationQueue线程没有EXC_BAD_ACCESS错误

StackOverflow https://stackoverflow.com/questions/2003445

  •  18-09-2019
  •  | 
  •  

我正在使用的UITableView显示一些串消息,我用NSOperationQueue成保持定制的NSOperation这在后台线程需要去抓取消息。一个消息成功取出后,定制的NSOperation将通知的UITableView控制器来显示它。

如果我点击后退按钮导航栏上的所有已加载消息之后从所述的UITableView切换到其他视图,每一件事情是确定。但是,如果我点击后退按钮,而一些消息仍然加载,一个EXC_BAD_ACCESS是抛出。我已检查的异常的发生而定制的NSOperation通知的UITableView控制器performSelectorOnMainThread方法。听起来像是目标的UITableView控制器不是无效的视图切换之后,但我认为导航控制器将持有的观点控制器实例。我想知道如何解决这个问题?感谢。

定制操作是在控制器的UITableView用下面的代码进行初始化:

StatusMessageLoadingOperation *operation = [[StatusMessageLoadingOperation alloc] 
                                            initWithData:person
                                            messageArray:cachedStatusMessages
                                            target:self 
                                            action:@selector(didFinishStatusMessages:)];
[operationQueue addOperation:operation];
[operation release];

定制的NSOperation类将更新的UITableView与以下代码:

- (void)main{
    for (int i = 0; i < [[person statusMessages] count]; i++) {
        [target performSelectorOnMainThread:action withObject:messageArray waitUntilDone:NO];
    }
}
有帮助吗?

解决方案

你有没有打过电话[operationQueue cancelAllOperations]viewWillDisappear方法?

其他提示

由于弹出一个视图控制器调用控制器的-dealloc方法,你可能会被释放您的队列得太早了,你的应用程序的其他部分正在试图访问队列或操作里面不再存在。

我的建议是把你的NSOperationQueue *myQueue实例到应用程序委托。

使用应用程序委托的-applicationDidFinishLaunching:-dealloc方法来初始化和释放您的队列及其内容。

从视图控制器分离的队列中,您的队列将不会当您从您的导航栈中弹出一个视图控制器释放。它和任何剩余的操作仍然应该提供给应用程序的其余部分。

要更容易地访问您的队列中,设置了下面的宏定义:

#define UIAppDelegate ((MyAppDelegate *)[UIApplication sharedApplication].delegate)

您可以再使用宏来访问您的队列如下,e.g:

NSLog(@"%@", [[UIAppDelegate myQueue] operations]);

或者,例如:

[[UIAppDelegate myQueue] addOperation:myOperation];
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top