2015-03-02 14 views
5

In ReactiveCocoa gibt es ein Makro zu verhindern, Zyklus @weakify und @strongify zu verhindern. Von meinem Verständnis @weakify etwas tun, was ich normalerweise tun, dass __weak Referenz für die Verwendung in dem Block erstellen, aber was ist mit @strongify?Was ist der Grund von @strongify

Warum muss ich es im Block wieder stark machen? Hier

einig Beispiel-Nutzung:

@weakify(self); 
[RACObserve(self, username) subscribeNext:^(NSString *username) { 
    @strongify(self); 
    [self validateUsername]; 
}]; 
+1

Sie müssen keine _strong_ Referenz wieder innerhalb des Blocks in dieser Situation machen, was Sie gepostet haben, es würde keinen Unterschied machen - aber wenn Sie mehrfach auf das selbe 'self' Objekt verweisen und Sie wollen um sicher zu gehen, dass das "self" gültig ist, bis der Block seinen Gültigkeitsbereich verlässt (so dass Ihr Block keinen halbfertigen Job auf Ihrem "Selbst" macht), müssen Sie ihn _strong_ bekommen. – holex

Antwort

5

Wenn Sie nur einen schwachen Verweis innerhalb des Blockes verwenden, kann selbst ausgeplant bekommen, während der Block ausgeführt wird. Wenn Sie jedoch sicherstellen möchten, dass self im Speicher bleibt, bis der Block die Ausführung beendet hat, müssen Sie die schwache Referenz wieder in strong konvertieren.

+0

Aber wenn das eigene Deallocated ist, bedeutet das nicht, dass ich kein Interesse mehr an diesem Block habe? Es sollte nicht einmal ausgeführt werden, da es zusammen mit sich selbst freigegeben wurde? – sarunw

+0

Nun, das hängt wirklich von Ihrem Anwendungsfall ab. Außerdem wird, wenn self vor dem Ausführen der Zuweisung deallocated * vor * der Block wird, strongSelf immer noch Null sein. Die Hauptidee ist das Szenario, in dem Self während der Ausführung des Blocks freigegeben werden konnte. Um die Freigabe während der Ausführung zu verhindern, verwenden Sie strongify. – rounak

+0

Also ist dies stark zu verhindern, dass 'EXC_BAD_ACCESS' die Verwendung von deallocated self in Block rechts verursacht? – sarunw

Verwandte Themen