解決:
このコードには問題がないことがわかりました。これは、破棄されるときに foo が UIViewController で呼び出されているためです。したがって、非同期の foo が完了ブロックを呼び出すと、もはや存在しないものへの呼び出しが原因で壊れます。
私がこれに時間を割いてしまった方々にはお詫び申し上げます。:/ これが他の人にとって、完了時に完了ハンドラーがまだ存在することを確認するための教訓になることを願っています。
始める前に、 Wait for many asynchronous calls to perform callback とChaining Completion Blocksを見てきましたが、両方の解決策は私の問題を解決しません。
状況:
完了ブロックを持つメソッド foo がありますが、完了ブロックを持つ別のメソッド bar を呼び出します。foo は、bar による完了ブロックの実行中にその完了ブロックを呼び出します。以下に例を示します。
-(void) foo:(void(^)())completion{
...
bar:^{
...
completion();
}
}
-(void) bar:(void(^)())completion{
...
completion();
}
これを行うと、foo の完了呼び出しで不正なアクセスが発生します。
__block
foo の完了パラメータのコピーを作成する必要がありますか?
__block (void(^)()) completionCopy;
もしそうなら、コンパイラさえ渡さないので、どうすればそれを作ることができますか?