在导航栏上切换视图时,如何在没有EXC_BAD_ACCESS错误的情况下安全地退出NSOperationQueue线程

时间:2010-01-05 00:52:17

标签: iphone nsoperationqueue

我正在使用UITableView来显示一些字符串消息,我使用NSOperationQueue来保存自定义的NSOperation,它在后台线程中获取消息。成功获取一条消息后,自定义的NSOperation将通知UITableView控制器显示它。

如果我在导航栏上单击后退按钮,在加载完所有消息后从UITableView切换到其他视图,那么每件事都可以。但是,如果我在某些消息仍然加载时单击后退按钮,则抛出EXC_BAD_ACCESS。我已经检查了自定义NSOperation使用performSelectorOnMainThread方法通知UITableView控制器时发生的异常。声音像目标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];
    }
}

2 个答案:

答案 0 :(得分:0)

您是否尝试在[operationQueue cancelAllOperations]方法中调用viewWillDisappear

答案 1 :(得分:0)

由于弹出视图控制器会调用该控制器的-dealloc方法,因此您可能过早地释放队列,并且应用程序的某些其他部分正在尝试访问队列或其中不再存在的操作。

我的建议是将您的NSOperationQueue *myQueue实例放入您的应用程序代理中。

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

通过将队列与视图控制器分离,当您从导航堆栈弹出视图控制器时,您的队列将不会被释放。它和任何剩余的操作仍然可用于应用程序的其余部分。

为了更容易访问您的队列,请设置以下宏定义:

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

然后您可以使用宏来访问您的队列,例如:

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

或者,例如:

[[UIAppDelegate myQueue] addOperation:myOperation];