2

このスニペットを使用して、いくつかの変数を遅延初期化しました。

__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これを修正する方法は?

4

1 に答える 1