質問

私は、デリゲートとして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が有効になっている、と彼らは何も報告しません。

任意のアイデア?

役に立ちましたか?

解決

ブロックをコピーする代わりに、それを保持してみてください。あなたがコピーを呼び出すまでブロックは、それがヒープにコピーされ、スタックに住んでます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top