0

我喜欢 JavaScript 将函数定义为变量的能力,并尝试在 Objective-C 中做类似的事情。特别是,我想使用一个匿名块编写一个递归函数,我可以在一个对象上调用它并让它在树中工作,在每个节点上应用一个更改:

void ( ^setDetailsLoaded )( Product* ) = ^void ( Product* prod ) {
    prod.detailsLoaded = true;
    for ( Group* group in prod.groups ) {
        for ( Product* mod in group.mods )
            setDetailsLoaded( mod );
    }
};
setDetailsLoaded( product ); <-- error here

error: address doesn't contain a section that points to a section in a object file但是,当我运行程序(编译良好)时,我遇到了奇怪的错误[原文如此]。

我只是想知道是否可能需要保留块或其他东西,或者我是否应该使用函数指针而不是块来执行此操作。

4

1 回答 1

3

由于块的实现方式——它们对所有原始类型变量进行 const 副本,并在创建时对其中引用的所有对象类型变量进行强引用——尝试在其内部递归引用块将导致崩溃锯。

您可以通过使用__block块变量本身的注释来解决这个问题:

__block void ( ^setDetailsLoaded )( Product* ) = ^void ( Product* prod ) {
    prod.detailsLoaded = true;
    for ( Group* group in prod.groups ) {
        for ( Product* mod in group.mods )
            setDetailsLoaded( mod );
    }
};

有关更多详细信息,请参阅@bbum 的关于块的博客文章(特别是提示 #7)。

于 2013-03-23T19:06:15.363 回答