Eigenschaften und Instanzvariablen in Objective-C
Ich bin ziemlich verwirrt über die Eigenschaften und Instanz-Variablen in Objective-C.
Ich bin etwa auf halbem Weg durch Aaron Hillegass ist "Cocoa Programming for Mac OS X" und alles ist logisch. Sie würden deklarieren Sie eine Klasse, so etwas wie dieses:
@class Something;
@interface MyClass : NSObject {
NSString *name;
NSArray *items;
Something *something;
IBOutlet NSTextField *myTextField;
}
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSArray *items;
- Da andere Objekte zu manipulieren, unsere
name
unditems
Instanz-Variablen, die wir verwenden@property
/@synthesize
zum generieren von Accessor/Mutator für Sie. In unserer Klasse, wir verwenden nicht die Accessor/Mutator—wir haben gerade die Interaktion mit der Instanz-Variablen direkt. something
ist nur eine Instanz-variable, die wir verwenden in unserer Klasse, und da sonst niemand verwenden muss, können wir es nicht schaffen, ein paar von Zugriffsmethoden und Mutatoren für die es.- Müssen wir die Interaktion mit einem text-Feld in unserer Benutzeroberfläche, so erklären wir eine
IBOutlet
für Sie, schließen Sie es, und wir sind fertig.
Alles sehr logisch.
Allerdings in der iPhone-Welt, die Dinge scheinen anders zu sein. Menschen erklären, - Eigenschaften für jede einzelne Instanz-variable, deklarieren Sie Eigenschaften, die für IBOutlets
und verwenden Accessor/Mutator Interaktion mit der Instanz-Variablen innerhalb der Klasse (z.B. Sie schreiben würden [self setName:@"Test"]
eher als name = @"Test"
).
Warum? Was ist Los? Sind diese Unterschiede iPhone-spezifisch ist? Was sind die Vorteile der Deklaration von Eigenschaften für alle Instanz-Variablen die Deklaration von Eigenschaften für IBOutlets
und mit Accessor/Mutator innerhalb Ihrer eigenen Klasse?
InformationsquelleAutor der Frage Steve Harrison | 2009-10-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der iPhone-Welt, es gibt keinen garbage collector zur Verfügung. Sie müssen sorgfältig verwalten von Speicher mit Referenz-Zählung. Mit dem im Verstand, betrachten die Differenz zwischen:
und
Wenn du direkt die Instanz-Variablen, ohne Vorherige überlegung, Sie verlieren den Bezug zu dem vorherigen Wert und Sie können nicht einstellen, seine retain count (Sie sollte
release
d es manuell). Wenn Sie Zugriff über eine Eigenschaft, es wird alles automatisch für Sie erledigt, zusammen mit erhöht die behalten Zählung der neu zugewiesenen Objekt.Ist das grundlegende Konzept ist nicht iPhone spezifisch, aber es wird von entscheidender Bedeutung in einer Umgebung ohne garbage collector.
InformationsquelleAutor der Antwort Mehrdad Afshari
Eigenschaften dienen zur Erzeugung von Zugriffsmethoden für Instanzvariablen, es gibt keine Magie passiert.
Können Sie implementieren die gleichen Zugriffsmethoden von hand.
Finden Sie in Aaron Hillegass ' Buch der Beispiele der 3 memory-management-Strategien für member-Variablen. Sie sind
assign/copy/retain
. Wählen Sie eine von Ihnen als notwendig für die bestimmte variable.Ich nehme an, Sie verstehen, memory management in Objective-c ...
Zugriffsmethoden verbergen die Komplexität und Unterschiede der Speicher-management für jede variable.
Beispiel:
ist eine einfache Zuordnung
name
hält nun mit Verweis aufNSString @"Test"
. Aber könnten Sie entscheiden, zu verwendencopy
oderretain
. Egal, welche version der Speicher-management-Sie wählte accessor verbirgt die Komplexität und Sie haben immer Zugriff auf die variable (oder ähnlich):Nun
setName:
verwenden könnteassign/copy or retain
und Sie nicht haben, sich darum zu kümmern.Meine Vermutung ist, dass iPhone-tutorials verwenden Sie Eigenschaften, um es einfacher für neue Entwickler springen durch die Speicherverwaltung (auch wenn es praktisch zu generieren, die entsprechenden Accessoren mit Eigenschaften, anstatt implementieren Sie von hand jedes mal).
InformationsquelleAutor der Antwort stefanB
Nicht iPhone-spezifisch. Außer in
init
Methoden und diedealloc
Methode, es ist eine gute Praxis, immer mit dem Accessor. Der Hauptvorteil, vor allem auf dem Mac (mit Cocoa Bindungen), ist, dass mit Ihren Accessoren bedeutet, frei KVO-Benachrichtigungen.Der Grund, warum die Menschen "deklarieren Sie Eigenschaften für jede einzelne Instanz-variable" ist wahrscheinlich, dass alle Ihre Instanz-Variablen sind Dinge, die Sie verfügbar machen möchten als Eigenschaften. Wenn Sie etwas hatten, würden Sie wollen, um private, Sie würde nicht erklären, eine Eigenschaft, für die es in der header-Datei. (Sie können jedoch eine Eigenschaft, für die es eine Klasse Erweiterung in der Umsetzung-Datei, um die oben genannten gratis-KVO-Benachrichtigungen.)
Deklaration von Eigenschaften für Steckdosen ist übertrieben, meiner Meinung nach. Ich sehe nicht einen Punkt, um es. Wenn Sie nicht eine Eigenschaft, die nib-loader legen Sie die Steckdose, indem direkte Instanz-variable zugreifen, das ist gut für diese Aufgabe.
InformationsquelleAutor der Antwort Peter Hosey
Ich würde vorschlagen, dass die moderne Entwicklung hat sich auch sehr stark versucht, zu identifizieren, zu definieren und best practices anwenden.
Unter diesen best-practices finden wir Kontinuität und Konsistenz.
Abgesehen von streiten über Verwendung von Accessoren in
init
unddealloc
Methoden, Zugriffsmethoden sollten generell verwendet werden, die ganze Zeit (innerhalb und außerhalb einer Klasse) für die Vorteile, die Sie bieten, einschließlich Kapselungpolymorphe var-Implementierungen (die beide ermöglichen, abstrahieren und refactoring) und zu erleichtern, jene besten Praktiken, die von Kontinuität und Konsistenz. Die grundlegenden Vorteile einer Objekt-orientierten Sprache kommen ins Spiel, wenn die Dinge in dieser Weise und ausnutzen der fülle der Sprache, die Fähigkeiten. Immer konsequent in einer s-Codierung ist eine oft unten profitieren, als alle senior-Programmierer in der Regel attestieren.InformationsquelleAutor der Antwort JRT
Können Sie schreiben, wie diese
InformationsquelleAutor der Antwort Shafraz Buhary