5

いくつかのブロックを呼び出そうとしましたが、EXC_BAD_ACCESSに遭遇しました。

-(void) methodA {
   self.block = ^ {
       [self methodB];
   };
}

-(void) webViewDidFinishLoad:(UIWebView *)webView {
       [block invoke]; // error here (block is not valid id type).
}

-(void)methodB {
    //do something
}

なぜこれが起こっているのかについて何か考えはありますか?

4

4 に答える 4

15

ブロックを呼び出したい場合は、block();代わりにこれを行うことができます[block invoke];

詳細については、ブロックプログラミングのトピックを参照してください。

于 2012-02-28T15:00:20.863 に答える
9

ブロックプロパティを宣言するときは、copy属性を使用する必要があります。好き:

@property (nonatomic, copy)   id block;
于 2012-02-28T15:22:19.563 に答える
1

ブロックをヒープに配置する必要があります。

self.block = Block_copy(^{
    [self someMethod];
});

編集: @muratの答えも正しいです(そしておそらくもっと良いです)。ブロックは実際にはヒープではなくスタックに作成されるため、いずれにせよ、ブロックをコピーする必要があります。

残しておきたいブロックの詳細については、ドキュメントの「ブロックのコピー」と「避けるべきパターン」を参照してください。

于 2012-02-28T15:21:33.703 に答える
0

このように.hファイルでブロックのプロパティを宣言することができ、それはbad-excessを与えません-

    typedef int (^devideEquallyBlock)(int);
    @property (nonatomic, copy) devideEquallyBlock callbackBlock;

プロパティを宣言する方法の詳細については、コピーを保持しないことを宣言してください。ios/objective-cでプログラミングをブロックします。

于 2012-03-26T11:00:56.383 に答える