2016-06-28 12 views
0

Nehmen wir folgende Situation:Warum beanstandet Xcode manchmal und nicht immer wenn self in einem Block verwendet wird?

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

Xcode wird sich beschweren, dass ich nicht selbst innerhalb dieser Methode verwenden können, oder ich einen Zyklus behalten haben.

Dann eine andere Situation. Ich erstelle eine Klasse, die ein Bild lädt und läuft etwas nach Abschluss und nenne es gerne

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

Xcode wird in diesem Fall nicht beschweren und selbst innerhalb eines Blockes verwendet wird!

warum?

Antwort

0

Der erste Fall:

Das self Objekt halten starkes Referenzobjekt zu blockieren.

Umgekehrt, Block von behalten auch self Objekt. 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. Sie können dies beziehen https://blackpixel.com/writing/2014/03/capturing-myself.html

Also, es wird beibehalten werden Zyklus!

+0

das den zweiten Fall nicht erklärt. Ich meine, warum xcode sich nicht beschwert. – SpaceDog

+0

Stellen Sie sicher, dass Sie den ersten Fall verstehen. Sie werden den 2. Fall verstehen. Über den zweiten Fall: die 'sharedInstance' von' MyImageClass' behält das Blockobjekt, das Blockobjekt behält das 'self' Objekt, das' self' Objekt behält keinen starken Bezug auf das Blockobjekt. In diesem Fall gibt es keinen Retain-Zyklus! – Proton