GCDブロックがinvokeにEXC_BAD_ACCESSをトリガー
-
25-09-2019 - |
質問
私は、デリゲートとしてGCDブロックを使用したい内部が、非ガベージコレクションMacFUSEのCocoaアプリケーションを作ってるんです。しかし、私のプログラムは、その道で唯一のEXC_BAD_ACCESS
を残して、ブロックの呼び出し中にクラッシュします。
私のプログラムは、フレームワーク構築されagainsガベージコレクション(や64ビット)とMacFUSEのフレームワークをサポートしていないのMac OS 10.5 SDKを使用しています。プログラムは、32ビットプログラムとして警告またはエラーで構築します。 (そのような最適化のレベルのような)他のビルド設定が元の値に放置した。
私はこのブロックおよびコールrunWithContinuation:
AFSPasswordPrompt* prompt = [[AFSPasswordPrompt alloc] initWithIcon:icon];
dispatch_block_t continuation = ^{
archive.password = prompt.password;
[self mountFilesystem:fsController];
[prompt performSelectorOnMainThread:@selector(release) withObject:nil waitUntilDone:NO];
};
[prompt runWithContinuation:continuation];
runWithContinuation:
ブロックを保持し、ペン先をインスタンス化します。ブロックは、ユーザーが「開く」ボタンを押して、プロンプトパスワードを閉じる回だけ呼び出されます。
-(void)runWithContinuation:(dispatch_block_t)block
{
continuation = [block retain];
[passwordPrompt instantiateNibWithOwner:self topLevelObjects:NULL];
imageView.image = image;
[window makeKeyWindow];
}
-(IBAction)open:(id)sender
{
continuation();
[self close];
}
-(void)close
{
[window close];
[continuation release];
}
私の問題は、私はcontinuation()
を打ったとき、私のプログラムはEXC_BAD_ACCESS
をトリガし、最後のスタックフレームが??
と呼ばれているということです。右その下open:
メソッド呼び出しです。
私は実際にそれから来るのどこか分かりません。 NSZombiesが有効になっている、と彼らは何も報告しません。
任意のアイデア?
解決
ブロックをコピーする代わりに、それを保持してみてください。あなたがコピーを呼び出すまでブロックは、それがヒープにコピーされ、スタックに住んでます。
所属していません StackOverflow