我用这段代码懒洋洋地初始化了一些变量:
__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
方法的堆栈时会发生变化。如何解决这个问题?
答案 0 :(得分:0)
您可以尝试使用双指针:
Foo *foo;
__block Foo **fooPointer = &foo;
[self lazilyGetFoo:^{
[Foo loadFoo:foo]; /* loadFoo method: *foo = <initialization here>; */
}];