2017-05-05 18 views
0

を保持し、私は別の会社からプロジェクトを引き継いだし、変数に値を割り当てるときに、私は多くの場合、コードのこの部分を参照してください。は、サイクル懸念

// interface: 
@property NSArray *foos; 


// somewhere in implementation: 
BOOL foosExist = ^BOOL { 
    return self.foos.count > 0; // self inside block 
}(); 

また、コンパイラの主張を根底にある変数_foosによってfoosプロパティに内部ブロックを参照するとき:

ブロックは暗黙的に「自己」を保持します。これが意図された動作であることを明示的に「自己」と言及する。

この内部ブロックは本当に保持サイクルを作成しますか?そうでない場合、なぜですか?誰かが詳しく説明できますか?

+0

ブロックを作成してすぐに実行するのはなぜですか? – newacct

+0

@newacct私は、可読性を向上させ、オブジェクト(ブロックの範囲外)の変更を減らすように設計されていると思います。ブロックは主に5よりLoCが多く含まれています。 – Neru

答えて

4

例にサイクルはありません。

ブロックは、式の評価中に作成された値で、すぐに適用されてBOOL値を生成します。

状況が珍しい場合は、ブロックを作成して同じ式ですぐに適用すると、ブロックを別の方法に渡すときに直接またはローカル変数に格納して変数値 - サイクルは作成されません。

代わりにあなたが同じブロックを作成したが、インスタンス変数(ないローカル変数)にそれを保存し、その後、selfはブロックを参照したい場合、ブロックはselfを参照するでしょう、そしてあなたは、サイクルを持っているでしょう。それ自体が悪いわけではなく、サイクルが決して壊れないと悪くなるだけで、リークの原因になります。しかし、インスタンス変数に異なる値を書き込むなど、ある時点でサイクルが壊れた場合、サイクルは決して問題になりません。

HTH

関連する問題