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:
In der zugehörigen .m-Datei gibt es jedoch keine @synthesize
-Deklaration.
Der Code in viewDidUnload
ist normal:
Der Code in dealloc
fügt jedoch einen _
für den Eigenschaftsnamen hinzu:
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?
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.
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.
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.
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?
Tags und Links objective-c xcode properties outlet