Apple doc には、「手動で参照カウントされた環境では、ブロックがコピーされるときに、ブロック内で使用されるローカル変数が保持されます。ブロック内でインスタンス変数を使用すると、オブジェクト自体が保持されます。」
ローカル変数がブロックによって保持されているか、retainCount を使用していないかを確認しようとしましたが、失敗しました。誰でも私を助けることができますか?
Apple doc には、「手動で参照カウントされた環境では、ブロックがコピーされるときに、ブロック内で使用されるローカル変数が保持されます。ブロック内でインスタンス変数を使用すると、オブジェクト自体が保持されます。」
ローカル変数がブロックによって保持されているか、retainCount を使用していないかを確認しようとしましたが、失敗しました。誰でも私を助けることができますか?
ブロックがコピーされない限り、ブロックはオブジェクトを保持しません。ブロックは、キャプチャされた状態と同じスコープ内の状態のみをキャプチャできるため、実装では、宣言のスコープをエスケープする目的でブロックがコピーされない限り、実際には何も保持する必要がないと見なされます。
「実行ポインター」の観点から考えてください (デバッガーでコードをステップ実行するときのようなものです)。
実行ポインターがブロックの宣言を通過すると、そのブロックはスナップショット (コピー) をキャプチャします。ブロックのスコープ内で使用され、ブロック自体では宣言されていないすべての変数です。オブジェクトの場合、ブロックはオブジェクト自体のコピーではなく、オブジェクトへの参照のコピーを作成することを意味します。
スタック上でブロックが開始されます。ブロックが初めてコピーされるとき、ブロックごとに生成されたコンパイラー「コピーヘルパー」を使用して、スタックからヒープにコピーされます (単純なブロックにはコピーヘルパーがなく、実際にはスタックにない場合があります)。__block
そのコピー ヘルパーは、ブロックによって参照されるオブジェクトを保持します (いずれにせよ、変数を介して参照されません)。
ブロックが解放され、割り当てが解除されるまで、それらは解放されません。
retainCount
役に立たない。
実装のドキュメントを信頼してください。何らかの理由でそれが失敗したり、期待に反する場合は、サンプル プログラムを提供してください。
保持カウントを確認する必要はありません。これが機能するためです。
疑いがあり、健全性をチェックしたい場合は、Instruments をNSObject
s の参照カウント操作を記録するように構成できます。その場合、通常どおり実行し (もちろん、Instruments から起動)、割り当てられたオブジェクトのリストで対象のインスタンスを見つけ、対象のオブジェクトの ref-count-ops のバックトレースを評価します。あなたはそこにそれを見るべきです。