9

Apple のサンプル コード で、Square Camのサンプル コードの一部を調べています。ARCを使用して、最新のプロジェクトでその機能の一部を複製したいと考えています。ただし、次のような多くの require ステートメントがあります。

BOOL success = (destination != NULL);
require(success, bail);

コンパイラ エラーが生成されます。

保護されたスコープに移動します。

私の質問は、ARC を使用するプロジェクトでそのようなステートメントを処理する適切な方法は何ですか?

4

3 に答える 3

10

私は同じ問題を抱えていました(同じサンプルコードで)。コードは次のようになります。

BOOL success = (destination != NULL);
require(success, bail);

//Initialise some variables

bail:
//Deal with errors

スコープを明確にするために、宣言を含むブロックを中かっこで囲みました。

BOOL success = (destination != NULL);
require(success, bail);
{
    // *** Initialise some variables ***
}
bail:
{
    //Deal with errors
}

そして、それは私にとって問題を解決しました。これを見て、ビルドエラーを展開して詳細を取得できる場合があることも学びました。

于 2012-11-02T03:30:11.643 に答える
3

どうやらbail1 つ以上の__block変数を持つスコープ内にあります。これは許可されていません。詳細については、 http://clang.llvm.org/compatibility.html#blocks-in-protected-scopeを参照してください。__blockそこで提案されている解決策は、変数を中かっこで区切られたブロックに入れて、変数の範囲を制限することです。これは常に機能するとは限りません。YMMV。

于 2012-07-09T04:04:35.877 に答える
0

@ Lewis42の回答に説明を追加しています。

変数を独自のスコープに入れない場合、goto の後にすべての変数の初期化をバイパスし、ARC が変数をクリーンアップしようとすると、メモリのランダムなビットを解放しようとすることになります。

変数を独自のスコープに入れたくない場合は、goto キーワードの下で変数を宣言しないようにしてください。

__block 変数スコープ内にジャンプします

__block には特別なランタイム初期化が必要です。__block 変数のスコープにジャンプすると、この初期化がバイパスされ、変数のメタデータが無効な状態のままになります。

于 2015-03-24T06:45:01.067 に答える