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
?
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: Ссылка
Hier deklarieren Sie eine Instanzvariable mit dem Namen _assets
:
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).
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.
Tags und Links objective-c ios