Ich bin überrascht, das folgende Verhalten zu finden ...
%Vor% In Xcode 4.6.1 bekomme ich eine Warnung in der Implementierung von -doSomethingWithBar:
, dass "Capturing 'self' in diesem Block wahrscheinlich zu einem Retain-Zyklus führt."
Wenn ich jedoch den Namen der Methode -addBar:withCompletion:
auf -setupBar:withCompletion:
umgrabe, wird diese Warnung weggenommen. Es scheint, dass meine Überraschung dadurch zeigt, dass ich eine Lücke in meinem Wissen über Objective-C Namenskonventionen habe!
Der Code
%Vor% erstellt im Allgemeinen keinen Retain-Zyklus. Wenn someMethod:withCompletion:
nur den Block aufruft und zurückgibt, gibt es überhaupt keinen Retain-Zyklus. ( -[NSArray enumerateObjectsUsingBlock:]
ist ein Beispiel.)
Nur wenn someMethod:withCompletion:
sich an den später auszuführenden Block "erinnert", gibt es einen möglichen Retain-Zyklus. So verwendet clang eine Heuristik, um zu entscheiden, ob es sich um eine "setter-like" -Methode handelt, die den Block in einer später auszuführenden Eigenschaft von Foo
speichert.
-set<Key>
und -add<Key>
sind Accessor-Muster in Schlüsselwertcodierung, um eine Eigenschaft festzulegen oder einen Wert zu einer (to-many) -Beziehung hinzuzufügen, und genau nach diesem sucht clang.
Dies ist in der Clang Quellcode :
%Vor%was hier aufgerufen wird:
%Vor% Ihre setupBar
-Methode wird nicht als "Setter-ähnliche" Methode behandelt, weil auf "set" kein Großbuchstabe folgt.
Tags und Links objective-c clang automatic-ref-counting