Ist es notwendig, schwache Referenzen auf sich selbst immer innerhalb von Blöcken zu verwenden ..?
Ich bin immer verwirrt mit der Nutzung des selbst im inneren blocks, ich gehe durch einige der Apple-Dokumente aber noch nicht finden können, die richtige Antwort.
Einige Leute immer sagen, schwachen selbst in Blöcken, aber einige sagen, schwachen selbst in Blöcken, die kopiert werden, nicht neassary zu verwenden, immer.
Beispiel 1:
self.handler = ^(id response, NSError *error)
{
self.newresponse = response; //use weak self here
};
Beispiel 2:
Mit schwachen selbst;
__weak myViewController *weakSelf = self;
[UIView animateWithDuration:interval delay:0.0 options:curve animations:^
{
[weakSelf.view.superview setTransform:CGAffineTransformMakeTranslation(0, -106)];
//in above is it use of weak is neassary
}
completion:^(BOOL finished)
{
}];
Ohne schwach selbst;
__weak myViewController *weakSelf = self;
[UIView animateWithDuration:interval delay:0.0 options:curve animations:^
{
[myViewController.view.superview setTransform:CGAffineTransformMakeTranslation(0, -106)];
}
completion:^(BOOL finished)
{
}];
In der oben genannten Proben, die korrekt sind...?
**Ich bin mit der ARC
InformationsquelleAutor der Frage ShivaPrasad | 2012-11-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie nur einen schwachen Verweis auf
self
wennself
halten wird eine Referenz des Blocks.In Ihrem Beispiel, Sie sind nicht zu halten eine Referenz auf den block in
self
Sie sind nur mit Hilfe von Bausteinen inline mit derUIView animateWithDuration:
und als solche gibt es keine Notwendigkeit zu verwenden__weak myViewController *weakSelf = self;
Warum ist das der Fall? Da ein block behalten starke Referenzen zu allen Variablen die es verwendet von der Klasse mit dem block. Dies beinhaltet
self
. Nun, wenn die Instanz der Klasse selbst hält einen starken Bezug auf den block und der block hält eine starke Referenz auf die Instanz der Klasse, Sie haben eine retain-Zyklus, die Speicherverluste verursachen.InformationsquelleAutor der Antwort WDUK
Hier ist etwas code, der veranschaulicht, @WDUK Antwort:
Den
test
- Methode druckt:Beobachten, dass in den
init
Methode derObjectThatDoesNotRetainBlock
erstellen wirblock
als ivar, aber wenn dieblock
geht out of scope, die wir nicht halten eine Referenz auf diese.In der
test
Methode, wenn die beiden Objekte außerhalb des Bereichs, zu beobachten, dassobjectThatDoesNotRetainBlock
aufgehoben wird, weil es nicht Teil eines Zyklus behalten.Auf der anderen Seite
objectThatRetainsBlock
nicht aufgehoben, denn es ist Teil eines Zyklus behalten. Es bleibt der block über den Anwendungsbereich der Methode aufrufen.Wenn Sie möchten, eine andere Erklärung, siehe diese Antwort.
InformationsquelleAutor der Antwort Rose Perrone