objective-c ios blocks - "__block"キーワードは何を意味しますか?





4 Answers

@bbumは、 ブログ投稿のブロックを詳細にカバーし、__blockストレージタイプを扱います。

__blockは異なるストレージタイプです

静的、自動、および揮発性と同様、__blockはストレージタイプです。 これは、変数の記憶域を別々に管理することをコンパイラに指示します。

...

ただし、__block変数の場合、ブロックは保持されません。 必要に応じて、あなたが保持し解放するのはあなた次第です。
...

ユースケースについては、 __blockは引数を保持しないため保持サイクルを避けるために使用されることがあります。 一般的な例として、selfを使用します。

//Now using myself inside a block will not 
//retain the value therefore breaking a
//possible retain cycle.
__block id myself = self;
使い方 ブロック 構文

Objective-Cの__blockキーワードとはどういう意味ですか? 私はあなたがブロック内の変数を変更することができることを知っていますが、私は知りたいです...

  1. それはコンパイラに正確に何を伝えていますか?
  2. それは他の何かをしますか?
  3. それがすべてであれば、最初はなぜ必要なのでしょうか?
  4. どこにいてもドキュメントにありますか? (私はそれを見つけることができません)。



__blockは、スコープ変数を変更可能にするために使用する記憶域型です。この指定子で変数を宣言すると、その参照は読み取り専用コピーではなくブロックに渡されます。詳しくは、「 iOSでのブロックプログラミング」を参照してください。




これがあなたを助けることを願って

次のようなコードがあるとしましょう:

{
     int stackVariable = 1;

     blockName = ^()
     {
      stackVariable++;
     }
}

ブロック内のスタック変数がデフォルトで不変であるため、 "variable is assignable"のようなエラーが発生します。

宣言の前に__block(storage修飾子)を追加すると、ブロック内で変更可能になります。つまり、 __block int stackVariable=1;




これは、プレフィックスである変数がブロック内で使用できることを意味します。




Related