ブロック/ARC のリテイン サイクルの問題に取り組んでおり、ニュアンスを理解しようとしています。任意のガイダンスをいただければ幸いです。
「ブロックと変数」に関する Apple のドキュメント (http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxVariables.html) には、次のように記載されています。
メソッドの実装内でブロックを使用する場合、オブジェクト インスタンス変数のメモリ管理のルールはより微妙になります。
参照によってインスタンス変数にアクセスする場合、self は保持されます。インスタンス変数に値でアクセスすると、変数は保持されます。次の例は、2 つの異なる状況を示しています。
dispatch_async(queue, ^{
// instanceVariable is used by reference, self is retained
doSomethingWithObject(instanceVariable);
});
id localVariable = instanceVariable;
dispatch_async(queue, ^{
// localVariable is used by value, localVariable is retained (not self)
doSomethingWithObject(localVariable);
});
この説明はわかりにくいと思います。
- これは「値による」/「参照による」用語の適切な使用ですか? これらの変数が同じタイプ (id) であると仮定すると、それらを区別する特徴はスコープにあるようです。
「参照」の例で自己がどのように参照されているかわかりませんか? アクセサー メソッドが使用されている場合 (例: 以下)、self が保持されていることがわかります。
doSomethingWithObject(self.instanceVariable);
物事をどのような方法でやりたいかについてのガイダンスはありますか?
- 「値渡し」変数を利用するのが従来の知恵である場合、追加の変数宣言のために多くの追加コードが必要になるように思われますか?
- 入れ子になったブロックが登場する状況では、意図せずに保持されたオブジェクトのポプリが最終的に発生する可能性があるため、ブロックを相互に宣言することを避ける方が保守しやすいように思われますか?