ブロックの更新を確認するためにスカラー変数に__block
ストレージタイプが必要ですが、オブジェクトにはいつ必要なのですか?私は__weak
は、ブロック内で使用される自己参照をキャプチャするときに使用する必要があると信じていますが、通常のオブジェクトには実際にストレージタイプを使用する必要があるときは表示されません。ARCでオブジェクト参照に__blockキーワードを使用する場合
答えて
__block
は、スカラー変数の値をブロック内のコードで変更したい場合に必要です。キャプチャされたスカラーはブロック内にconst
と表示されるため、変更することはできません。オブジェクトへのポインタがある場合、同じ区別が適用されます。キャプチャされたポインタ自体はポインタconst
になります。したがって、変更することはできませんが、オブジェクト内のオブジェクトはブロック内のコードによって変更できます。指示されたオブジェクトを変更する場合は、ポインタ自体を変更する必要があるため、ポインタは__block
タイプで宣言する必要があります。オブジェクト自体を__block
と宣言する必要はありませんが、ポインタを変更する必要がある場合に限り、オブジェクトへのポインタだけを宣言する必要はありません。
あなたが正しいメンタルモデルを持っていれば、ブロックは紛らわしいことではありません。ブロックはスタックに最初に割り当てられていることを知っておくことが重要です。スタックフレームがポップされるとレキシカルスコープが破棄されると消滅します。ブロックが作成されたレキシカルスコープのライフタイムを過ぎてブロックがハングするようにするには、Block_copy()
を使用してヒープに移動するか、-copy
というメッセージを送信します。ブロックがヒープにコピーされると、キャプチャされたすべてのconst
変数が移動し、変数const
が指すオブジェクトがすべて保持されます。ブロックがヒープから削除されると、const
変数が指すすべてのオブジェクトが解放されます。
__block
変数 "under the hood"には、ブロックに含まれるコンパイラが使用する(そして表示されない)間接的なインダイレクション層があるため、ブロックがヒープにコピーされると、キャプチャされた__block
変数不可視ポインタは、これらの__block
変数の新しいヒープ位置を指すように調整されます。つまり、変数__block
のアドレスが変更される可能性があるため、そのアドレスを使用する場合は注意が必要です。 __block
変数は、ある意味ではブロックの外側に存在することがわかります。したがって、これらの変数はブロック外部のコードから読み取って変更できます。
私は簡単にしてきたが、あなたはますます複雑に記載されている、ここではより良い説明を見つけることができます。また
http://ios-blog.co.uk/tutorials/programming-with-blocks-an-overview/
http://www.cocoawithlove.com/2009/10/how-blocks-are-implemented-and.html
http://www.mikeash.com/pyblog/friday-qa-2011-06-03-objective-c-blocks-vs-c0x-lambdas-fight.html
ブロックが参照としてどこかに渡された場合、そのブロックをパラメータとして受け取っているものは、ブロックをすぐにコピーして将来使用する必要がありますか? – chinabuffet
ブロック参照が、ブロックが定義されているレキシカルスコープ(スタックフレーム)よりも長時間続く場合は、ブロックオブジェクトをヒープに移動するためにブロック参照をコピーする必要があります。私はブロックを作成するときにコピーを作成する方が、作成から離れた場所でこれらのコピーを作成するよりも安全だと思います。 – Fred
これらは、関数レベルの変数に使用されます。これらはブロック(および囲みスコープ)内で変更可能であり、参照するブロックがヒープにコピーされると保持されます。 __block
記憶修飾子で宣言された囲むレキシカルスコープのローカル変数は、参照によって提供されるため、変更可能です。すべての変更は、同じ囲みレキシカルスコープ内で定義された他のブロックを含む、囲みレキシカルスコープに反映されます。
__block
変数は、変数のレキシカルスコープと、変数のレキシカルスコープ内で宣言または作成されたすべてのブロックおよびブロックコピーとの間で共有されるストレージに存在します。したがって、フレーム内で宣言されたブロックのコピーがフレームの終わりを超えても存続する場合(たとえば、後で実行するためにキューに入れられるなど)、ストレージはスタックフレームの破棄に耐えられます。したがって、ブロック内のオブジェクトを変更する必要がある場合や、スタックフレームが破棄された後にオブジェクトが必要な場合に使用してください。
- 1. __block ARCのivarブロックの自己参照サイクル
- 2. ARCで独自の補完ブロックでNSOperationオブジェクトを参照する
- 3. awaitキーワードを使用する場合
- 4. オブジェクトが存在する場合でもCodedUI null参照例外
- 5. 継承を使用する場合の未解決の参照
- 6. Report.DataSourceConnectionsを使用する場合:「オブジェクト参照がオブジェクトのインスタンスに設定されていません」
- 7. スワイフで3種類のキーワード「as」を使用する場合
- 8. ARCを使用する場合の条件付きコンパイル
- 9. ARCを使用する場合のデリゲートの宣言
- 10. 自分で__blockを使用する
- 11. ARCを使用してiOS 4.0をターゲットに設定する場合、弱参照を置き換えるにはどうすればよいですか?
- 12. Unity 4.0を使用する場合の循環参照を回避するC#
- 13. __block変数が保持されないのはなぜですか(非ARC環境の場合)?
- 14. 参照渡しのときにオブジェクトが別名で渡される場合は、
- 15. Objective-cの "__block"キーワードはどのように使用されていますか?
- 16. Javaの弱い参照:GC収集オブジェクトの場合
- 17. の「参照」のキーワードと参照型の私のチームで
- 18. Logbackを使用する場合、Hibernateのクエリパラメータを参照してください。
- 19. 合成しないプロパティにはARCキーワードが必要ですか?
- 20. メソッドとオブジェクトを使用する場合
- 21. Hamlオブジェクト参照の使用。 %DIV [@user]
- 22. Entity Frameworkのオブジェクト参照の使用
- 23. 参照オブジェクトをスレッド間で使用する
- 24. 静的変数と自己キーワードを使用する場合
- 25. JavaScriptプロトタイプオブジェクトを使用する場合のイベントメソッドの "this"キーワード
- 26. NSDictionary + ARC +コピーと参照の比較
- 27. iOS:MBProgressHUDおよび自動参照カウント(ARC)
- 28. 自動参照カウント(ARC)とretainCount
- 29. __blockを使用する必要があるときにARCが教えてくれますか?
- 30. ファイナライザでCOMオブジェクトを参照/使用できますか?
[何__weakと__blockの違い参照?](http://stackoverflow.com/questions/11773342/what-the-difference-between-weak-and-block-reference) –
私は特に尋ねています: '__block'ストレージタイプsh ARCを使用するときにスカラーではないオブジェクト参照で使用されますか?それらの他のリンクがその質問に答えるなら私はそれを逃した。 – chinabuffet
@chinabuffet:スカラー型とオブジェクトポインタ型の違いはありません。 – newacct