Blöcke behalten den Zyklus von der Namenskonvention bei?

7

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!

    
edelaney05 20.03.2013, 22:19
quelle

1 Antwort

19

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.

    
Martin R 20.03.2013, 23:06
quelle