4

デリゲート メソッド内にブロックを作成し、それを使用して別のクラスの静的メソッドを呼び出しています。NSZombies を有効にしても、EXC_BAD_ACCESS エラーが発生します。同様の問題に関するいくつかの投稿がここにあります-これが最も近いと思います:

ARC: デリゲート メソッドで使用されるブロック内から EXC_BAD_ACCESS を取得する

しかし、これまでのところ、役に立ったものは何も見つかりませんでした。コードは次のとおりです。

@interface MyClass()
@property (nonatomic, copy) CaseBlock c;
@end

....

//NSURLConnection delegate method
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{        
    NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys:
                       //blows up after executing this
                       ^() { [AnotherClass staticMethod]; },authURL,
                       ^() { NSLog(@"TODO");}, searchURL,
                       ^() { NSLog(@"TODO"); }, itemURL,
                       nil];
    self.c = [[d objectForKey:[self.url path]] copy];

    if (self.c) {
        self.c();
    } else { NSLog(@"WARN unexpected response path"); }

}

ブロックを使用しようとしたのはこれが初めてですが、ブロックの外側からメソッドを呼び出すと問題なく動作するため、これが問題の原因であることがわかります。また、私が知る限り、私が書いたすべてのコードが実際に実行され、EXC_BAD_ACCESS エラーが発生します。しかし、私はObjective-Cを初めて使用するので、間違っている場合は修正してください。

4

1 に答える 1

9

ブロックが作成されたスコープよりも長く存続する必要がある場合は、ブロックをコピーする必要があります。dictionaryWithObjectsAndKeys:オブジェクトは一般的に扱われ、具体的にはブロックではないため、オブジェクトをコピーすることを認識していないため、オブジェクトを渡す前にコピーする必要があります。

NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys:
                   //blows up after executing this
                   [^() { [AnotherClass staticMethod]; } copy], authURL,
                   [^() { NSLog(@"TODO");} copy], searchURL,
                   [^() { NSLog(@"TODO"); } copy], itemURL,
                   nil];
于 2013-02-07T06:42:46.963 に答える