1

iPhone アプリの場合、NSOperationQueue を使用して、SQLite データベースへのアクセスを一度に 1 つのクエリに制限しています。NSOperation のサブクラスを作成し、メイン関数には次のものがあります。

- (void)main
{    
    // ... other code here ...

    if( [_delegate respondsToSelector:@selector(queryCompleted:)] )
    {
        [_delegate performSelectorOnMainThread:@selector(queryCompleted:) 
                                    withObject:self
                                 waitUntilDone:NO];
    }
}

デリゲート側:

- (void)queryCompleted:(QueryOperation*)aQueryOperation
{
     // Breakpoint here allows me to explore and see the members of aQueryOperation

     id results = [aQueryOperation resultSet]; // Crashes here

     // ... more code here ...
}

私が渡す理由はself、デリゲートがクエリ操作の ID (デリゲートごとに複数の要求が開かれている場合) とクエリの結果にアクセスできるようにするためです。

のドキュメントにはperformSelectorOnMainThread:withObject:waitUntilDone:、次のように明確に記載されています。

「このメソッドは、セレクターが実行されるまでレシーバーと arg パラメーターを保持します。」

ただし、デリゲート メソッドが引数にアクセスしようとすると、「EXC_BAD_ACCESS」例外がスローされます。理由について何か考えはありますか?

奇妙なことに、クラッシュする NSOperation オブジェクトへの参照の前にブレークポイントを設定すると、デバッガーは、オブジェクト インスタンスとすべてのパラメーターの値を表示することを許可します。

4

1 に答える 1

0

waitUntilDone: パラメータを YES に設定してみてください。NSOperation 自体の割り当てを解除できる競合状態が発生している可能性があります。

于 2010-06-02T10:06:24.330 に答える