0

我正在使用 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];
    }
}
4

2 回答 2

0

您是否尝试过调用[operationQueue cancelAllOperations]您的viewWillDisappear方法?

于 2010-01-05T01:05:19.127 回答
0

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

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

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

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

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

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

然后,您可以使用宏访问您的队列,如下所示:

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

或者,例如:

[[UIAppDelegate myQueue] addOperation:myOperation];
于 2010-01-05T01:05:34.087 回答