2

我使用这个片段来懒惰地初始化一些变量:

__block Foo *foo;

[self lazilyGetFoo:^{
    foo = <initialization here>;
}];

这工作正常。但是,现在初始化例程被移动到一个方法中,并且下面的代码在 EXC_BAD_ACCESS inside 失败loadFoo,当分配*foo发生时:

__block Foo *foo;

[self lazilyGetFoo:^{
    [Foo loadFoo:&foo];   /* loadFoo method: *foo = <initialization here>; */
}];

原因很清楚——通过应用&运算符获得的指针的地址在被复制到foo方法的堆栈时会发生变化。如何解决这个问题?

4

1 回答 1

0

你可以试试双指针:

Foo *foo;
__block Foo **fooPointer = &foo;

[self lazilyGetFoo:^{
    [Foo loadFoo:foo];   /* loadFoo method: *foo = <initialization here>; */
}];
于 2013-08-19T21:06:54.253 回答