2016-06-28 4 views
0

は、次のような状況を仮定しますブロック内で自己が使用されていると、Xcodeが時には不満を持ち、いつもそうではないのですか?

self.collectionViewController.didEndDisplayingCell = ^(CollectionViewCell *cell) { 
    [self doSomething];  
    }; 

Xcodeは私がそのメソッドの内部で自己を使用することはできませんと文句を言うだろうか、私は保持サイクルを持つことになります。

次に、別の状況です。私はそれが好きな画像をロードし、完了時に何かを実行し、呼び出すクラスを作成

[[MyImageClass sharedInstance] loadImageFromUrl:url 
          runOnCompletion:^(UIImage *image) { 
           [self doSomething]; 
          }]; 

Xcodeのは、その場合には文句を言わないだろうし、自己がブロック内で使用されています!

なぜですか?

答えて

0

最初のケース:

selfオブジェクトは、オブジェクトをブロックする強力な参照を続けます。

逆も同様にブロックselfのオブジェクトを保持します。 Since blocks capture their context, package it up, and carry it along for the ride, any reference to self (or implicit reference with an ivar) within a block also will capture a strong reference to self。あなたはこれを参照することができますhttps://blackpixel.com/writing/2014/03/capturing-myself.html

したがって、それはサイクルを保持する!

+0

これは、2番目のケースを説明していません。私はなぜxcodeが不平を言っていないのかを意味します。 – SpaceDog

+0

最初のケースを理解してください。 2番目のケースを理解します。第2のケースについて: 'MyImageClass'の' sharedInstance'はブロックオブジェクトを保持し、ブロックオブジェクトは 'self'オブジェクトを保持し、' self'オブジェクトはブロックオブジェクトを強く参照しません。この場合、保持サイクルはありません! – Proton

関連する問題