0

UITableView を使用していくつかの文字列メッセージを表示しています。また、NSOperationQueue を使用して、バックグラウンド スレッドでメッセージを取得するカスタマイズされた NSOperation を保持しています。1 つのメッセージが正常に取得されると、カスタマイズされた NSOperation が UITableView コントローラーに通知して表示します。

すべてのメッセージが読み込まれた後、ナビゲーション バーの戻るボタンをクリックして UITableView から他のビューに切り替えると、すべて問題ありません。しかし、メッセージがまだロードされている間に戻るボタンをクリックすると、EXC_BAD_ACCESS がスローされます。カスタマイズされた NSOperation がperformSelectorOnMainThreadメソッドで UITableView コントローラーに通知しているときに例外が発生したことを確認しました。ビューを切り替えた後、ターゲットの UITableView コントローラーは無効ではないように聞こえますが、Navigation Controller は View Controller インスタンスを保持すると思います。この問題を解決する方法を教えてください。ありがとう。

カスタマイズされた操作は、次のコードを使用して 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 に答える