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[sic] が表示されます (正常にコンパイルされます)。

おそらくブロックか何かを保持する必要があるのか​​ 、それともブロックの代わりに関数ポインタでこれを行うべきなのか疑問に思っています。

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 に答える