Xcode 4.5 Interface Builder Fügt Unterstrichen Unterstriche hinzu

8

Hat Xcode 4.5 eine etwas andere Art der automatischen Generierung von Eigenschaften und ihrer zugeordneten Speicherfreigabeabschnitte (in dealloc und viewDidUnload)?

Ich habe gestern von 4.5 Beta 1 auf Xcode 4.5 aktualisiert. Jetzt, wenn ich Interface Builder verwende, um eine Steckdose zu erstellen (durch Ziehen mit der Strg-Taste z. B. von einem UILabel zur zugehörigen Headerdatei), erstellt es die Deklaration @property in der Kopfzeile wie folgt:

%Vor%

In der zugehörigen .m-Datei gibt es jedoch keine @synthesize -Deklaration.

Der Code in viewDidUnload ist normal:

%Vor%

Der Code in dealloc fügt jedoch einen _ für den Eigenschaftsnamen hinzu:

%Vor%

Dies bedeutet auch, dass ich die Eigenschaft nicht als normal referenzieren kann ( [propertyName doSomething]; )

Hat sich etwas geändert? Oder habe ich zufälligerweise versehentlich eine Einstellung geändert?

    
eattrig 23.09.2012, 05:13
quelle

5 Antworten

13

Ja, das Verhalten hat sich in Xcode 4.5 etwas geändert.

  

... in der zugehörigen .m-Datei gibt es keine @ synthesize-Deklaration.

In Xcode 4.5 ist die @synthesize -Anweisung jetzt optional und Eigenschaften werden automatisch synthetisiert. Automatisch generierte IBOutlet-Eigenschaften fügen daher @synthesize nicht mehr hinzu, weil sie nicht mehr benötigt werden.

  

... der Code in dealloc fügt dem Eigenschaftsnamen

einen _ hinzu

Wenn Eigenschaften automatisch synthetisiert werden (ohne eine explizite @ synthesize-Anweisung), wird die entsprechende Instanzvariable mit einem Unterstrich vorangestellt. Deshalb taucht es in Ihrer Dealloc-Methode auf. Dies ist so, dass sich die Instanzvariablen und Eigenschaftsnamen nicht überschneiden.

  

Dies bedeutet auch, dass ich die Eigenschaft nicht als normal referenzieren kann

Nein. Der Zugriff auf Instanzvariablen und -eigenschaften wurde nicht geändert. Alles, was sich geändert hat, ist der Standardname der Instanzvariablen. Zum Beispiel:

%Vor%

Der Unterstrich ist nur eine Frage des Stils, so dass es klarer ist, dass Sie auf die Instanzvariable anstatt auf die Eigenschaft zugreifen.

Beachten Sie, dass Sie eine @ synthesize-Anweisung selbst hinzufügen können. Dadurch wird der Name der entsprechenden Instanzvariablen so festgelegt, wie Sie es haben möchten. Wenn Sie eigene Eigenschafts-Accessor-Methoden hinzufügen, verhindert dies, dass die Instanzvariable automatisch generiert wird.

    
Darren 23.09.2012, 05:56
quelle
3

Xcode erstellt nun automatisch alle Eigenschaften als Instanzvariable namens _propertyName . In vielen Fällen benötigen Sie nicht mehr @synthesize oder eine Instanzvariable explizit zu deklarieren.

    
Carl Veazey 23.09.2012 05:23
quelle
2

Mit XCode 4.5 wird jetzt der Unterstrich zur zugrunde liegenden Instanzvariablen hinzugefügt. Aber die einzige Auswirkung, die dies für Sie hat, ist, dass Sie auf diese Variable mit dem Unterstrich verweisen müssen. Hier ist ein Beispiel:

%Vor%

In Ihrem Implementierungscode können Sie auf die Farbe wie folgt verweisen:

%Vor%

Für die Außenwelt bleiben die Dinge unverändert.

%Vor%

Diese Änderung basiert auf der üblichen Vorgehensweise, Instanzvariablen mit einem Unterstrichpräfix zu benennen, um sie von lokalen Variablen in Ihrem Code zu unterscheiden.

    
aLevelOfIndirection 23.09.2012 05:27
quelle
0

Beachten Sie auch, dass Sie normalerweise auf Ihre Eigenschaft als [self.propertyName doSomething]; zugreifen möchten. Daher ist es sinnvoll, die Instanzvariable automatisch mit einem Unterstrich zu versehen, um den Datenschutz anzugeben.

Wenn Sie wirklich müssen, greifen Sie darauf als [_propertyName doSomething] zu, wenn Sie es automatisch synthetisieren lassen, aber das Getter umgeht. Oder Sie können @synthesize propertyName = propertyName; wieder [propertyName doSomething] verwenden, aber warum sollten Sie?

    
Vervious 23.09.2012 05:29
quelle
-1

Ich habe festgestellt, dass Sie, wenn Sie vor Ihrem @ property-Namen einen Unterstrich verwenden, die gewünschten Methoden wie zuvor wieder implementieren können.

    
Josh G 23.09.2012 05:27
quelle