Deklaration unter Schnittstelle in Ziel C

8

Ich studiere das Ziel-C-Programmierbuch von Big Nerd Ranch. Ich habe einen Code wie folgt gesehen:

%Vor%

Warum deklarieren Sie in diesem Code NSMutableArray *_assets unter der Schnittstelle? Worin unterscheidet sich das, als es als Eigentum zu deklarieren, und welchem ​​Zweck dient es?

Schließlich sehe ich, dass in einer Eigenschaft ein NSArray *assets ist. Ist das im Grunde dasselbe wie NSMutableArray *_assets ?

    
Kahsn 28.04.2015, 21:30
quelle

3 Antworten

1

Ich bin mir nicht sicher, warum sie das getan haben, aber als allgemeine gute Praxis sollten Sie das nicht selbst tun. Die Header-Datei sollte für die öffentliche Schnittstelle der Klasse reserviert sein. Fügen Sie nur Dinge ein, die Aufrufer und Benutzer dieser Klasse tatsächlich sehen müssen, was im Allgemeinen Eigenschaften, Methoden und vielleicht extern Konstanten sein werden.

Dann stellt sich in der Implementierung die Frage, ob eine Eigenschaft oder eine reguläre Instanzvariable verwendet werden soll. Dies ist weitgehend Präferenz basiert. Manche Leute deklarieren Eigenschaften für alles und benutzen keine einfachen Ivars. Andere verwenden Ivars für alles und nur für Eigenschaften, wenn sie einen benutzerdefinierten Setter / Getter für die betreffende Variable deklarieren wollen. Ich bin im letzteren Lager, aber es ist strittig, dass es klarer und einfacher zu lesen ist, wenn alles nur eine Eigenschaft ist.

Bearbeiten

Ich habe den Code falsch gelesen. Was ich oben gesagt habe, steht normalerweise, aber was sie dort tun, ist die Offenlegung einer API, die sich von den zugrunde liegenden Daten unterscheidet. Meine Antwort jetzt bearbeiten.

Wenn Sie eine Eigenschaft ohne ein benutzerdefiniertes @synthesize deklarieren und ohne dass Setter und Getter überschrieben wurden, wenn sie anwendbar sind, wird eine zugrunde liegende Variable mit dem Unterstrich davor erstellt. Was sie hier tun, gibt ein NSArray in der öffentlichen API zurück, um sicherzustellen, dass die interne Variable nicht geändert wird, während intern ein NSMutableArray verwendet wird.

Ich würde sagen, dass die Variablendeklaration ( NSMutableArray *_assets; ) jedoch immer noch in der Implementierungsdatei enthalten sein sollte. Der Anrufer sollte wahrscheinlich nicht wissen müssen, dass er unter der Haube veränderbar ist.

Tatsächlich gibt es bereits eine Menge existierender Fragen, die sich darauf beziehen. Hier ist eine Suchanfrage mit einer Anzahl von ihnen: Ссылка

    
Dima 28.04.2015, 21:43
quelle
2

Hier deklarieren Sie eine Instanzvariable mit dem Namen _assets :

%Vor%

Sie können diese Variable jetzt in der Implementierung Ihrer Klasse verwenden:

%Vor%

Instanzvariablen sind jedoch in Objective-C privat, was gut ist, wenn Sie nicht möchten, dass etwas anderes darauf zugreift. Was aber, wenn Sie andere Klassen benötigen, um auf assets zugreifen und / oder ändern zu können?

In den meisten Fällen möchten Sie eine Eigenschaft iVar verwenden.

Indem wir eine Eigenschaft verwenden, erstellen wir automatisch die Setter und Getter, was bedeutet, dass sie für die Anpassung überschrieben und von anderen Klassen verwendet werden können (wenn sie in der Kopfzeile .h file platziert sind).

%Vor%

NSMutableArray ist nur das veränderbare (editierbare) Gegenstück zu NSArray, dh wir können die Werte des Arrays ändern, indem wir neue hinzufügen, alte löschen und die Indizes verschieben.

    
Oliver Atkinson 28.04.2015 21:48
quelle
0

Die Schlüsselidee ist, dass die Instanzvariable einen anderen Typ als die Eigenschaftsdeklaration hat: sie ist änderbar, während die Eigenschaftsdeklaration unveränderlich ist.

    
Azat 28.04.2015 21:44
quelle

Tags und Links