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 オブジェクトへの参照の前にブレークポイントを設定すると、デバッガーは、オブジェクト インスタンスとすべてのパラメーターの値を表示することを許可します。