このスニペットを使用して、いくつかの変数を遅延初期化しました。
__block Foo *foo;
[self lazilyGetFoo:^{
foo = <initialization here>;
}];
これはうまくいきます。loadFoo
ただし、現在、初期化ルーチンはメソッドに移動されており、以下のコードは、への代入が*foo
発生すると、内部の EXC_BAD_ACCESS で失敗します。
__block Foo *foo;
[self lazilyGetFoo:^{
[Foo loadFoo:&foo]; /* loadFoo method: *foo = <initialization here>; */
}];
その理由は明らかです。演算子を適用して取得したポインタのアドレスは、メソッドのスタック&
にコピーされるときに変更されます。foo
これを修正する方法は?