11

Müssen wir __weak self in UIAnimation Blocks wie unten angegeben verwenden? Ob es zu einem Retain-Cycle-Problem kommt, wenn wir self nicht als schwach definieren?Müssen wir __weak self in UIAnimationBlocks in ARC verwenden?

[UIView animateWithDuration:animationDuration 
         delay:0 
        options:UIViewAnimationCurveEaseInOut 
       animations:^{ 
     [self doSomething]; 
    } completion:^(BOOL finished) { 
     if (finished) { 
      [self doSomething]; 
     } 
    }]; 

Ich bin auch in dem folgenden Szenario verwirrt. Irgendwelche Gedanken dazu? Bitte teile deine Kommentare.

[self.navController dismissViewControllerAnimated:animated 
             completion:^{ 
                 [self doSomething]; 
                }]; 

Sollten wir hier schwach selbst benutzen?

+0

Danke Jungs, ich werde klarer und klarer. Ich möchte auch den folgenden Fall diskutieren. [self.navController disneyViewControllerAnimated: animierte Vervollständigung:^{ [self doSomething]; }]; –

Antwort

23

Dies ist kein Retain-Zyklus. Ein Zyklus beibehalten würde

self -> block -> self 

In diesem Fall sind wir

animation framework -> block 
block -> self 

, wo behalten die erste nur vorübergehend ist - der Block freigegeben wird, wenn die Animation endet. Selbst wenn ein Retain-Zyklus stattfindet, wird er nur temporär sein und die Freigabe von Objekten nicht verhindern.

+0

Was ist mit dem folgenden Fall void (^ animateBlock) (void) =^(void) { [Selbst DoSomething]; }; –

+0

@ arango_86 Das ist der gleiche Fall, den Sie in Ihrer Frage geschrieben haben. Um einen Aufbewahrungszyklus zu erstellen, müssen Sie zunächst eine Eigenschaft für Ihr Objekt erstellen, z. '@property (nichtatomisch, Kopie) void (^ animateBlock) (void)' und dann ihm 'self.animationBlock =^(void) {[self doSomething]; }; '. – Sulthan

+0

Die Verwendung von schwachem Selbst in der Animation ist immer noch gut, so dass der View-Controller nicht freigegeben wird, wenn er nicht mehr sichtbar ist - und es ist nicht sinnvoll, die Animation auszuführen, wenn der View-Controller nicht mehr angezeigt wird. – Boon

1

Nein, es wird kein Aufbewahrungszyklus erstellt, da der Block (Verschluss) nicht an self angehängt ist.
Weitere Informationen finden Sie in Apples Automatic Reference Counting.

2

Sie müssen __weak verwenden, wenn Retain-Zyklus möglich ist. Dies ist nicht dieser Fall, weil Animationen Block selbst nicht beibehalten wird.

Eine andere zu verwendende Situation __weak ist eine verlängerte Aktion, die unseren Block nach der Fertigstellung aufruft und self kann während dieser Aktion freigegeben werden. Zum Beispiel ruft eine Netzwerkanforderung das Schnittstellen-Update für unseren View-Controller im Completion-Block auf. Der Benutzer kann unseren Bildschirm während der Anfrage verlassen. In dieser Situation keine Notwendigkeit, self mit einem Block zu behalten, ist es besser, schwache Selbst zu verwenden. Aber die Verwendung von Animationsblöcken ist nicht diese Situation auch.