0

ガベージコレクションされていないMacFUSECocoaアプリケーションを作成しています。その中で、GCDブロックをデリゲートとして使用したいと思います。ただし、ブロックの呼び出し中にプログラムがクラッシュしEXC_BAD_ACCESS、トレイルにのみが残ります。

私のプログラムは、ガベージコレクション(または64ビット)をサポートしないMac OS10.5SDKに対して構築されたフレームワークとMacFUSEフレームワークを使用しています。プログラムは、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は有効になっており、何も報告しません。

何か案は?

4

1 に答える 1

2

try copying the block instead of retaining it. A block lives on the stack until you call copy, then it is copied to the heap.

于 2010-11-18T05:06:05.710 に答える