現在、Obj-Cブロックの基本と__blockストレージタイプを理解するのに問題があります。次のドキュメントから:
私は次の段落と例を理解しようとしています:
ブロックがコピーされると、ブロック内で使用されるオブジェクト変数への強力な参照が作成されます。メソッドの実装内でブロックを使用する場合:
参照によってインスタンス変数にアクセスする場合、自己への強力な参照が行われます。値でインスタンス変数にアクセスする場合、変数への強力な参照が行われます。次の例は、2つの異なる状況を示しています。
dispatch_async(queue, ^{
// instanceVariable is used by reference, a strong reference is made to self
doSomethingWithObject(instanceVariable);
});
id localVariable = instanceVariable;
dispatch_async(queue, ^{
/*
localVariable is used by value, a strong reference is made to localVariable
(and not to self).
*/
doSomethingWithObject(localVariable);
});
特定のオブジェクト変数のこの動作をオーバーライドするには、__blockストレージタイプ修飾子を使用してマークを付けることができます。
私の質問:
- 一方の例は「参照によってアクセス」され、もう一方の例は変数によってアクセスされるので、どの程度正確ですか。localVariableが「値によって使用される」のはなぜですか?
- このドキュメントは、「自己を強く参照する」とはどういう意味ですか?それはどの「自己」を指しているのですか?
- 2番目の例で__blockストレージタイプをlocalVariableに追加した場合、ブロックが変数を閉じて、ブロックが解放されるまでヒープ内に保持されると想定するのは間違っていますか?他に何が起こっていますか?
ありがとうございました!