Objective-C Kurz gesagt Eigenschaften

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 deklarieren

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.


Eigenschaften implementieren

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

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.

Anpassen von Accessoren

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;

Punkt-Syntax

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.


Zusammenfassung

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.