1

私のUIViewContrrlerにはダウンロードブロックメソッドがあります

-(void)test
{
    __block UIViewController *temp = self;
    [[DownloadController sharedDownload] _complete:^{
        [temp testMethod];
    }];
}

ViewContrrler を終了すると、ダウンロードが完了しません。ダウンロードが完了すると、私のブロックメソッドエラー "[temp testMethod]; EXC_BAD_ACCESS"

4

2 に答える 2

0

あなたの説明から、MRC の '__block' は 'self' がブロックによって保持されないことを意味するため、MRC を使用していると思います。ビュー コントローラを終了すると、'self' が解放されます。ダウンロードが完了し、ブロックが呼び出されると、「temp」はダングリング ポインターになります。

ダウンロードが完了したときに testMethod を実行する必要があることを確認したい場合は、次を使用する必要があります。

-(void)test
{
    [[DownloadController sharedDownload] _complete:^{ 
        [self testMethod];
    }];
}

それ以外の場合は、ファイルを ARC に変更して、次のコードを使用できます。

-(void)test
{
    __weak UIViewController *temp = self;
    [[DownloadController sharedDownload] _complete:^{
       [temp testMethod];
    }];
}
于 2015-07-22T09:45:06.770 に答える
0

__blockまた、このオブジェクトがブロックによって保持されないことも意味します。したがって、pop ビュー コントローラーを呼び出してから呼び出そうとするとtestMethod、割り当てが解除されたオブジェクトにメッセージが送信されます。

考えられる解決策: - ダウンロード処理が完了するまでビュー コントローラーを保持します (ただし、 の文字列__blockは正しく記述されています)。この方法は機能しますが、正しくないようです。- ブロックからメソッドを直接呼び出す代わりに通知を使用する - 別のオブジェクトを使用して、シングルトンなどのダウンロード結果を処理する

于 2014-09-01T09:20:42.340 に答える