3

オブジェクトのチェーンがあります。チェーンに沿ったオブジェクトは、機能を適切に分割するために存在します。完了ブロックはチェーンに渡されます。別のオブジェクトが完了ブロックに何かを追加したい場合は、最初のブロックを呼び出して同じタイプのブロックで完了ブロックをラップするだけで、すべてがエースになると思いました。EXC_BAD_ACCESS を取得します。私の構文は間違っていますか、それとも完全に間違った方法でこれに取り組んでいますか?

-(void)archiveChatWithDictionary:(NSDictionary*)dictionary andCompletionBlock:(ServerConnectionCompletionBlock)completionBlock
{
    ServerConnectionCompletionBlock localCompletionBlock = ^(ServerConnection *connection, NSError *error) {

        // Do some stuff
        // ...

        //  This line produces EXC_BAD_ACCESS
        completionBlock(connection, error);
    };    

    [self.chatEndpointInterface archiveChatWithDictionary: dictionary andCompletionBlock: localCompletionBlock];
}
4

2 に答える 2

3

最後に、completionBlock はコピーされますか (または、コピーされたブロックにインライン化されますか)。

デフォルトでは、ブロックはスタックに格納されます。ブロックを保持したい場合 (通常は完了ブロック用)、それをコピーする必要があります (そのため、ヒープに移動します)。

良いことは、ブロックをコピーすると、ネストされたすべてのブロックもコピーされることです。

于 2012-07-19T00:58:39.250 に答える
0

私はまったく同じことをしていて、それは完璧に機能しています。

しかし、私はそのクラッシュを起こしました、そしてラップされたブロックがゼロであることがわかりました。おそらくあなたはそれをチェックすることができます。

特定の状況に応じて、ブロックがnilでないことを表明するか、ブロック呼び出しの前にifステートメントを配置することをお勧めします。

于 2012-09-26T08:43:20.693 に答える