Nachdem wir nun herausgefunden haben, welche Datentypen verfügbar sind, können wir darüber sprechen, wie sie tatsächlich produktiv genutzt werden. Wir haben gelernt, wie Eigenschaften in Hello, Objective-C deklariert werden. In diesem Kapitel werden die Nuancen hinter öffentlichen Eigenschaften und Instanzvariablen eingehender behandelt. Zuerst werfen wir einen kurzen Blick auf die grundlegende Syntax von Eigenschaften und Instanzvariablen. Anschließend werden wir diskutieren, wie Verhaltensattribute zum Ändern von Zugriffsmethoden verwendet werden.
Eigenschaften können in einer Schnittstelle mit dem deklariert werden @Eigentum
Richtlinie. Werfen wir einen kurzen Überblick über die Person.h
Datei, die wir im Hello, Objective-C-Kapitel erstellt haben:
#einführen@Interface Person: NSObject @Eigenschaft (Kopie) NSString * Name; @Ende
Hiermit wird eine Eigenschaft aufgerufen, die aufgerufen wird Name
vom Typ NSString
. Das (Kopieren)
Attribut teilt der Laufzeitumgebung mit, was zu tun ist, wenn jemand versucht, den Wert von festzulegen Name
. In diesem Fall wird eine unabhängige Kopie des Werts erstellt, anstatt auf das vorhandene Objekt zu zeigen. Im nächsten Kapitel, Speicherverwaltung, werden wir mehr darüber sprechen.
In Hello, Objective-C haben wir die verwendet @ synthetisieren
Direktive zum automatischen Erstellen von Getter- und Setter-Methoden. Denken Sie daran, dass die Getter-Methode einfach der Name der Eigenschaft und die Standard-Setter-Methode ist Name einsetzen
:
#import "Person.h" @implementation Person @synthesize name = _name; @Ende
Es ist jedoch auch möglich, die Zugriffsmethoden manuell zu erstellen. Wenn Sie dies manuell tun, hilft Ihnen das zu verstehen @Eigentum
und @ synthetisieren
machen hinter den Kulissen.
Enthaltenes Codebeispiel: ManualProperty
Fügen Sie zunächst eine neue Eigenschaft zum hinzu Person
Schnittstelle:
@ property (copy) NSString * name; @ property unsigned int age;
Beachten Sie, dass wir speichern Alter
als primitiver Datentyp (nicht als Zeiger auf ein Objekt), sodass vor dem Eigenschaftsnamen kein Sternchen erforderlich ist. Zurück in Person.m
, Definieren Sie die Zugriffsmethoden explizit:
- (unsigned int) age return _age; - (void) setAge: (unsigned int) age _age = age;
Das ist genau was @ synthetisieren
hätte es für uns getan, aber jetzt haben wir die Möglichkeit, Werte zu überprüfen, bevor sie zugewiesen werden. Wir vermissen jedoch eines: das _Alter
Instanzvariable. @ synthetisieren
automatisch erstellt ein _Name
ivar, so dass wir dies für die Name
Eigentum.
Instanzvariablen, auch Ivars genannt, sind Variablen, die innerhalb der Klasse verwendet werden sollen. Sie können in geschweiften Klammern nach einer der beiden deklariert werden @Schnittstelle
oder @Implementierung
richtlinien. Zum Beispiel in Person.h
, Ändern Sie die Schnittstellendeklaration wie folgt:
@Interface Person unsigned int _age;
Dies definiert eine aufgerufene Instanzvariable _Alter
, Diese Klasse sollte nun erfolgreich kompiliert werden. In einer Schnittstelle deklarierte Instanzvariablen sind standardmäßig geschützt. Die äquivalente C # -Klassendefinition würde ungefähr so aussehen:
Klasse Person protected uint _age;
Objective-C-Bereichsmodifizierer sind die gleichen wie in C #: Private Variablen sind nur für die enthaltende Klasse zugänglich, geschützte Variablen sind für alle Unterklassen zugänglich, und öffentliche Variablen sind für andere Objekte verfügbar. Sie können den Umfang von Instanzvariablen mit der definieren @Privatgelände
, @geschützt
, und @Öffentlichkeit
Anweisungen innerhalb von @Schnittstelle
, wie im folgenden Code gezeigt:
@interface Person: NSObject @private NSString * _ssn; @protected unsigned int _age; @public NSString * job;
Öffentliche Ivars liegen etwas außerhalb der Objective-C-Normen. Eine Klasse mit öffentlichen Variablen verhält sich eher wie eine C-Struktur als eine Klasse. Anstelle der üblichen Nachrichtensyntax müssen Sie die ->
Zeigeroperator. Zum Beispiel:
Person * frank = [[Personenzuweisung] init]; frank-> job = @ "Astronaut"; NSLog (@ "% @", Frank-> Job); // NOT: [Frank Job];
In den meisten Fällen möchten Sie jedoch die Implementierungsdetails mit einem ausblenden @Eigentum
Deklaration statt öffentlicher Instanzvariablen. Da Instanzvariablen technisch gesehen Implementierungsdetails sind, behalten viele Programmierer sie jedoch bei alles Instanzvariablen privat. In diesem Sinne erklärten die Efen in @Implementierung
sind standardmäßig privat. Also, wenn Sie das verschieben würden _Alter
Erklärung an Person.m
anstelle der Kopfzeile:
@implementation Person unsigned int _age;
_Alter
wäre als ein Privatgelände Variable. Beachten Sie dies, wenn Sie mit Instanzvariablen in Unterklassen arbeiten, da die unterschiedlichen Standardwerte für die Deklaration der Benutzeroberfläche gegenüber der Implementierung für Neulinge bei Objective-C verwirrend sein können.
Aber genug zu Instanzvariablen; Kommen wir zu den Eigenschaften zurück. Zugriffsmethoden können unter Verwendung mehrerer Eigenschaftsdeklarationsattribute (z., (Kopieren)
). Einige der wichtigsten Attribute sind:
Getter = GetterName
- Passen Sie den Namen der Getter-Zugriffsmethode an. Denken Sie daran, dass der Standardwert einfach der Name der Eigenschaft ist.Setter = Setzername
- Passen Sie den Namen der Setter-Zugriffsmethode an. Denken Sie daran, dass der Standardwert ist einstellen
gefolgt von dem Namen der Eigenschaft (z., Name einsetzen
).schreibgeschützt
- Machen Sie die Eigenschaft schreibgeschützt, dh es wird nur ein Getter synthetisiert. Standardmäßig sind Eigenschaften Lese- und Schreibzugriff. Dies kann nicht mit der verwendet werden Setter
Attribut.nichtatomisch
- Geben Sie an, dass die Zugriffsmethoden nicht threadsicher sein müssen. Die Eigenschaften sind standardmäßig atomar. Dies bedeutet, dass Objective-C eine Sperre / Zurückhaltung verwendet (beschrieben im nächsten Kapitel), um den Wert zurückzugeben Komplett Wert von einem Getter / Setter. Beachten Sie jedoch, dass dies der Fall ist nicht Gewährleistung der Datenintegrität über alle Threads hinweg - lediglich, dass Getter und Setter atomar sein werden. Wenn Sie sich nicht in einer Thread-Umgebung befinden, sind nichtatomare Eigenschaften viel schneller.Ein häufiger Anwendungsfall für das Anpassen von Getter-Namen sind boolesche Namenskonventionen. Viele Programmierer bevorzugen es, vorauszusehen ist
in boolesche Variablennamen. Dies ist einfach über die zu implementieren Getter
Attribut:
@ property (getter = isEmployed) BOOL verwendet;
Intern kann die Klasse das verwenden beschäftigt
Variable, aber andere Objekte können das verwenden ist angestellt
und setEmployed
Accessoren zur Interaktion mit dem Objekt:
Person * frank = [[Personenzuweisung] init]; [Frank SetName: @ "Frank"]; [Frank SetEmployed: JA]; if ([frank isEmployed]) NSLog (@ "Frank ist angestellt"); else NSLog (@ "Frank ist arbeitslos");
Viele der anderen Eigenschaftsattribute beziehen sich auf die Speicherverwaltung, auf die im nächsten Abschnitt eingegangen wird. Es ist auch möglich, mehrere Attribute auf eine einzelne Eigenschaft anzuwenden, indem sie durch Kommas getrennt werden:
@ property (getter = isEmployed, readonly) BOOL verwendet;
Neben Getter- / Setter-Methoden können Sie auch auf Punktnotation zugreifen, um auf deklarierte Eigenschaften zuzugreifen. Für C # -Entwickler sollte dies weitaus bekannter sein als die in eckigen Klammern verwendete Messaging-Syntax von Objective-C:
Person * frank = [[Personenzuweisung] init]; frank.name = @ "Frank"; // Wie [frank setName: @ "Frank"]; NSLog (@ "% @", frank.name); // Wie [Frank Name];
Beachten Sie, dass dies nur eine Bequemlichkeit ist. Sie wird direkt in die zuvor beschriebenen Getter / Setter-Methoden übersetzt. Punktnotation kann nicht für Beispielmethoden verwendet werden.
Eigenschaften sind ein wesentlicher Bestandteil jeder objektorientierten Programmiersprache. Dies sind die Daten, mit denen die Methoden arbeiten. Das @Eigentum
Eine Direktive ist eine bequeme Möglichkeit, das Verhalten einer Eigenschaft zu konfigurieren, tut aber nichts, was nicht durch manuelles Erstellen von Getter- und Setter-Methoden erreicht werden kann.
Im nächsten Kapitel werden wir ausführlich darauf eingehen, wie Eigenschaften im Speicher abgelegt werden, sowie einige neue Eigenschaftsattribute zur Steuerung dieses Verhaltens. Danach tauchen wir in Methoden ein, die die objektorientierten Kernwerkzeuge von Objective-C abrunden.
Diese Lektion stellt ein Kapitel von Objective-C Succinctly dar, ein kostenloses eBook des Teams von Syncfusion.