虽然导航栏上的切换视图,如何安全退出NSOperationQueue线程没有EXC_BAD_ACCESS错误
-
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];