奇妙な状況があります。関数にいくつかのローカル変数があります。
JSContext *cx = ...;
jsval successCb = ...;
これらのパラメーターを取る関数呼び出しがあります。
//JS_RemoveValueRoot(JSContext *cx, jsval *vp);
JS_RemoveValueRoot(cx, &successCb); //works
上記は正常にコンパイルされます。ただし、代わりに次のものを使用すると、コンパイル時エラーが発生します。
id foo = ^() {
JS_RemoveValueRoot(cx, &successCb);
}
文字通り、行をコピーして貼り付けると、ブロックの外側にある場合はコンパイルされますが、そうでない場合はコンパイルされません。エラーは次のとおりです。
No matching function for call to 'JS_RemoveValueRoot'
ブロッククロージャの実装方法に関して、舞台裏で何かが起こっているのではないかと思いますが、これを理解できるほどObjective Cに精通していません。これによりコンパイル時エラーが発生するのはなぜですか? また、どのように修正すればよいですか?
編集:次のようにすると、コンパイル時エラーが発生しなくなりますが、これは私には意味がありません。これは常に悪いことなので、説明が必要です...
id foo = ^() {
jsval localSuccessCb = successCb;
JS_RemoveValueRoot(cx, &localSuccessCb);
};