この問題に関する Apple のドキュメントには、次のように記載されています。
ブロックがコピーされると、ブロック内で使用されるオブジェクト変数への強力な参照が作成されます。メソッドの実装内でブロックを使用する場合:
参照によってインスタンス変数にアクセスすると、self への強い参照が作成されます。
インスタンス変数に値でアクセスすると、変数への強い参照が作成されます。
コード例があります:
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);
});
しかし、私には意味がありません。インスタンス変数に値でアクセスするにはどうすればよいですか? いつも参照経由でアクセスしていませんか?self.myVariable
それであろうとなかろうとid newName = self.myVariable
、それは常に参照によるものです。
次に、この例は、それらが何を意味するのかあまり明確ではありません。最初のケースでは自己保持され、2 番目のケースでは保持されないのはなぜですか? どこでも使用されていないのに、なぜブロックがそれをキャプチャするのでしょうか?