Fix-Warnung "In diesem Block wurde ein [Objekt] stark aufgenommen. Dies führt wahrscheinlich zu einem Retain-Zyklus" in ARC-aktiviertem Code
In ARC-fähigen code, wie zu beheben eine Warnung über einen potentiellen retain-Zyklus, bei Verwendung einer block-Basis-API?
Warnung:
Capturing 'request' strongly in this block is likely to lead to a retain cycle
produziert durch dieses code-snippet:
ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:...
[request setCompletionBlock:^{
NSDictionary *jsonDictionary = [[CJSONDeserializer deserializer] deserialize:request.rawResponseData error:nil];
//...
}];
Warnung im Zusammenhang mit der Nutzung des Objekts request
im block.
Kommentar zu dem Problem
Sie sollten wahrscheinlich mit
responseData
statt rawResponseData
, check ASIHTTPRequest-Dokumentation. InformationsquelleAutor der Frage Guillaume | 2011-08-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Antworten mir:
Mein Verständnis der Dokumentation sagt, dass die Verwendung von keyword -
block
und setzen die variable auf nil, nachdem Sie es in den block, sollte ok sein, aber es zeigt immer noch die Warnung.Update: habe es auf Arbeit mit dem Schlüsselwort '_schwach' statt '_block', und die Verwendung einer temporären variable:
Wenn Sie wollen auch auf iOS 4 verwenden Sie
__unsafe_unretained
statt__weak
. Dasselbe Verhalten, aber der Zeiger bleibt baumeln, anstatt automatisch auf null, wenn das Objekt zerstört wird.InformationsquelleAutor der Antwort Guillaume
Das Problem tritt auf, weil Sie die Zuordnung einer block-Anforderung, die einen starken Bezug zur Anfrage. Der block wird automatisch beibehalten verlangen, so die ursprüngliche Anfrage nicht freigeben, weil der Zyklus. Sinn?
Es ist nur seltsam, weil Sie-tagging das request-Objekt mit __ - block, so kann es beziehen auf sich selbst. Sie können dieses Problem beheben, durch das anlegen einer schwachen Referenz neben.
InformationsquelleAutor der Antwort ZaBlanc
Es bewirkt, dass aufgrund der Beibehaltung der selbst in den block. Block wird aufgerufen aus sich selbst, und sich selbst bezeichnet, im block. so erstellen Sie einen Zyklus behalten.
Versuchen, dies zu lösen, indem erstellen ein schwaches Zitat von
self
InformationsquelleAutor der Antwort HDdeveloper
Einige Male der xcode compiler hat Probleme, für die Bezeichner der retain-Zyklen, also, wenn Sie sicher sind, dass Sie nicht zu behalten completionBlock Sie können ein compiler flag wie diese:
InformationsquelleAutor der Antwort GOrozco58
Wenn ich versuche, die Lösung von Guillaume, alles ist in Ordnung im Debug-Modus, aber es crashs in den Release-Modus.
Beachten, dass don ' T verwenden __schwach, aber Sie __unsafe_unretained, weil mein Ziel ist iOS 4.3.
Mein code crashs, wenn setCompletionBlock: genannt wird auf das Objekt "request" : Anfrage wurde aufgehoben ...
So, diese Lösung funktioniert sowohl in der Debug-und Release-Modi :
InformationsquelleAutor der Antwort squall2022
was der Unterschied zwischen __weak und __block-Referenz?
InformationsquelleAutor der Antwort Emil Marashliev
Werfen Sie einen Blick in die Dokumentation auf der Apple Entwickler-website : https://developer.apple.com/library/prerelease/ios/#documentation/General/Conceptual/ARCProgrammingGuide/Introduction.html#//apple_ref/doc/uid/TP40011029
Gibt es einen Abschnitt über retain-Zyklen am Ende der Seite.
InformationsquelleAutor der Antwort Nyx0uf