Ich habe den folgenden Code gesehen:
//example.h
MKMapView * mapView1;
@property (nonatomic, retain) MKMapView * mapView;
//example.m
@synthesize mapView = mapView1
Wie ist die Beziehung zwischen mapView
und mapView1
? Erstellt es eine set
und get
Methode für mapView1
?
iphone
objective-c
Hoang Duy Nam
quelle
quelle
Antworten:
In Ihrem Beispiel
mapView1
handelt es sich um eine Instanzvariable (ivar), einen Speicher, der zu einer Instanz der inexample.h
und definierten Klasse gehörtexample.m
.mapView
ist der Name einer Eigenschaft . Eigenschaften sind Attribute eines Objekts, die mit der Punktnotation gelesen oder festgelegt werden können :myObject.mapView
. Eine Eigenschaft nicht haben , um auf einem Ivar basieren, aber die meisten Eigenschaften sind. Die@property
Erklärung sagt der Welt einfach, dass es eine Eigenschaft namens gibtmapView
.@synthesize mapView = mapView1;
Diese Zeile weist den Compiler an, einen Setter und einen Getter für zu erstellen und
mapView
den aufgerufenen ivar zu verwendenmapView1
. Ohne das= mapView1
Teil würde der Compiler annehmen, dass die Eigenschaft und ivar denselben Namen haben. (In diesem Fall würde dies einen Compilerfehler erzeugen, da kein ivar aufgerufen wirdmapView
.)Das Ergebnis dieser
@synthesize
Anweisung ähnelt dem, wenn Sie diesen Code selbst hinzugefügt haben:Wenn Sie diesen Code selbst zur Klasse hinzufügen, können Sie die
@synthesize
Anweisung durch ersetzen@dynamic mapView;
Die Hauptsache ist eine sehr klare konzeptionelle Unterscheidung zwischen Ivaren und Eigenschaften. Sie sind wirklich zwei sehr unterschiedliche Konzepte.
quelle
@synthesize
Erstellt einen Getter und einen Setter für die Variable.Auf diese Weise können Sie einige Attribute für Ihre Variablen angeben. Wenn Sie
@synthesize
diese Eigenschaft für die Variable verwenden, generieren Sie den Getter und Setter für die Variable.Der Eigenschaftsname kann mit dem Variablennamen identisch sein. Manchmal möchten die Benutzer, dass es anders ist, um es in
init
oderdealloc
oder wenn der Parameter mit demselben Variablennamen übergeben wird, zu verwenden.quelle
Aus der Dokumentation :
quelle
Da ich beim Bearbeiten von Legacy-Code gerade auf dieses Problem stoße, möchte ich zusätzliche Notizen zu den vorhandenen Antworten machen, die man beachten muss.
Selbst mit einer neueren Compilerversion macht es manchmal einen Unterschied, ob Sie weglassen
@synthesize propertyName
oder nicht .In dem Fall, dass Sie eine Instanzvariable ohne Unterstrich deklarieren, während Sie sie noch synthetisieren, wie z.
Header:
Implementierung:
self.someInt
greift auf dieselbe Variable zu wiesomeInt
. Die Verwendung eines führenden Unterstrichs für Ivars folgt nicht den Namenskonventionen, aber ich bin gerade in eine Situation geraten, in der ich solchen Code lesen und ändern musste.Aber wenn Sie jetzt denken "Hey, @synthesize ist nicht mehr wichtig, da wir einen neueren Compiler verwenden" , liegen Sie falsch! Ihre Klasse führt dann zu zwei Ivaren , nämlich
someInt
einer automatisch generierten_someInt
Variablen. Soself.someInt
undsomeInt
die gleichen Variablen nicht mehr ansprechen. Wenn Sie ein solches Verhalten wie ich nicht erwarten, kann dies zu Kopfschmerzen führen.quelle
@synchronize
ist eine Anweisung zum Synchronisieren von Threads beim Zugriff auf die Eigenschaft und@synthesize
zum Binden der Eigenschaft an eine Instanzvariable über Getter und Setter.Autosynthesized property 'someInt' will use synthesized instance variable '_someInt', not existing instance variable 'someInt'
. (Ich weiß nicht, in welcher Version von xcode diese Warnung hinzugefügt wurde.)Gemäß der Apple-Dokumentation wird @Synthesize nur zum Umbenennen von Instanzvariablen verwendet. Beispielsweise
Jetzt in der Klasse können Sie nicht verwenden,
_str
da die obige Zeile die Instanzvariable in umbenannt hatstr2
@property
Ermöglicht die Verwendung von Objekten durch Objekte in anderen Klassen oder macht das Objekt mit anderen Worten öffentlich.quelle
Wenn Sie eine Eigenschaft in @interface erstellen, wird diese Eigenschaft automatisch von einer Instanzvariablen mit dem Namen _propertyName zurückgegeben. Wenn Sie also eine Eigenschaft mit dem Namen firstName erstellen, erstellt der Compiler hinter den Kulissen standardmäßig eine Instanzvariable mit dem Namen _firstName. Der Compiler erstellt auch die Getter- und Setter-Methode für Sie (dh firstName, setFirstName).
Wenn Sie nun die Eigenschaft mit @synthesize firstName synthetisieren, teilen Sie dem Compiler einfach mit, dass meine Instanzvariable (_firstName) durch firstName umbenannt wird. Wenn Sie Ihre gesicherte Instanzvariable mit einem anderen Namen umbenennen möchten, können Sie einfach einen anderen Namen zuweisen, während Sie den Eigenschaftsnamen synthetisieren (dh @synthesize firstName = myFirstName). Auf diese Weise wird Ihre Eigenschaft durch eine Instanzvariable mit dem Namen myFirstname gesichert.
Kurz gesagt, @synthesize wurde die meiste Zeit verwendet, um Ihre von Ihrer Eigenschaft gesicherte Instanzvariable umzubenennen.
quelle
Siehe die Apple-Dokumente
Grundsätzlich erstellt die Synthese eine setMapView- und eine mapView-Methode, die mapView1 setzt und abruft
quelle
Es erstellt Getter und Setter für Ihr Objekt. Sie können mit so etwas zugreifen:
oder
mapView1 ist der Name des ivar in der Klasse, mapView ist der Name für die Getter / Setter-Methode (n).
quelle