__block变量作为从块调用的方法的out参数

时间:2013-08-19 20:51:55

标签: objective-c objective-c-blocks

我用这段代码懒洋洋地初始化了一些变量:

__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方法的堆栈时会发生变化。如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您可以尝试使用双指针:

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

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