Frage

Ich versuche zu verstehen, den Zweck des synthesize die Richtlinie mit den Namen der Eigenschaft überschreiben.Sagen, dass ich eine Schnittstelle wie folgt definiert:

@interface Dummy ... {
    UILabel *_dummyLabel;
}

@property (retain, nonatomic) UILabel *dummyLabel;

Und in der Umsetzung Datei, die ich habe:

@synthesize dummyLabel = _dummyLabel;

Von dem, was ich verstehe, "dummyLabel" ist nur ein alias für die Instanz-variable "_dummyLabel".Gibt es einen Unterschied zwischen dem selbst._dummyLabel und sich selbst.dummyLabel?

War es hilfreich?

Lösung

Ja. self._dummyLabel nicht definiert ist, aber _dummyLabel ist es nicht.

Dot-syntax erweitert aus, um einfache Methodenaufrufe, so es ist nicht spezifische Eigenschaften.Wenn Sie haben eine Methode namens -(id)someObject, zum Beispiel im Fall von object.someObject, es wird sein, als ob Sie schrieb [object someObject];.

self.dummyLabel  //works
self._dummyLabel //does not work
dummyLabel       //does not work
_dummyLabel      //works
[self dummyLabel];  //works
[self _dummyLabel]; //does not work

Andere Tipps

Ihr Verständnis ist falsch. dummyLabel der name der Eigenschaft und ist nicht ein alias für die Instanz-variable - die Instanz-variable ist nur genannt _dummyLabel.So gilt für eine Instanz von Dummy genannt myObject:

  • [myObject dummyLabel] Werke
  • myObject.dummyLabel Werke
  • [myObject _dummyLabel] fehl
  • myObject._dummyLabel fehl
  • myObject->dummyLabel fehl
  • myObject->_dummyLabel hängt die Sichtbarkeit der ivar (@public, @private, @protected)
  • [myObject valueForKey: @"dummyLabel"] Werke
  • [myObject valueForKey: @"_dummyLabel"] abhängig von der implementation der +accessInstanceVariablesDirectly (d.h.es funktioniert in der Standard-Fall, wo +accessInstanceVariablesDirectly zurück YES).

Der Vorteil, der einem anderen Namen für die ivar als für die Eigenschaft ist dass Sie leicht sehen können, in den code wenn Sie Zugriff auf eine oder die andere - Andre K

Ich bin nicht in der Lage zu finden, ein "Kommentar" - button, so bin ich zur post als "Antwort".

Nur erweitern wollte auf Andre ' s comment - wissen, wenn Sie sind mit den synthetischen Eigenschaften vs Vanille-variable, Sie wissen (insbesondere im Falle von setter), wenn eine variable wird beibehalten/kopiert/veröffentlicht werden Dank Ihrer schönen setter, vs manipuliert durch hand.

Natürlich, wenn Sie die Dinge richtig tun, werden Sie wahrscheinlich nicht brauchen die Hilfe einer Set-beibehalten/freigeben von Objekten richtig!Es können aber auch andere Szenarien zu denen, die sich auf Ihrer ivars als self.ivar statt _ivar kann hilfreich sein, beispielsweise wenn Sie mit benutzerdefinierten setter/Getter anstelle der Standard-synthetisiert lieben.Vielleicht, jedes mal Sie ändern eine Eigenschaft, die Sie auch wollen, zu speichern, zu NSUserDefaults.So haben Sie vielleicht einige code wie diese:

@interface SOUserSettings : NSObject {

BOOL _autoLoginOn;

}

@property (nonatomic, assign) BOOL autoLoginOn;

@end

@implementation SOUserSettings

@synthesize autoLoginOn = _autoLoginOn;

- (void)setAutoLoginOn:(BOOL)newAutoLoginOnValue {

   _autoLoginOn = newAutoLoginOnValue;
   [[NSUserDefaults standardUserDefaults] setBool:_autoLoginOn forKey:@"UserPrefAutoLoginOn"];
}

@end

Hinweis:Dies ist nur illustrative code, es könnte tausend Dinge falsch mit es!

So, jetzt, in Ihrem code, wenn Sie haben eine Zeile, die sagt _autoLoginOn = YES - Sie wissen, dass es nicht gerettet werden zu NSUserDefaults, während, wenn Sie verwenden self.autoLoginOn = YES Sie wissen genau, was passieren wird.

Der Unterschied zwischen _autoLoginOn und self.autoLoginOn ist mehr als nur Semantik.

Ich sehe keinen großen Vorteil umbenennen _dummyLabel zu dummyLabel

In einigen ObjC Laufzeiten Sie haben eine harte Zeit mit der Herstellung von Instanz-Variablen unsichtbar für Benutzer der Klasse.Für Sie kleben einige Präfix (oder suffix) auf die Instanz-Variablen können deutlich machen (oder klarer), dass Sie nicht wollen, dass jemand messing mit Variablen.Aber Sie wollen nicht, dass die klebrige Masse auf Ihren öffentlichen Funktionen.Diese können Sie ausschalten.

Es könnte auch nützlich sein, wenn Sie halten müssen, um einen alten interface mit einer Reihe von Namen in der gleichen Zeit wie einen neuen Satz von APIs mit einem neuen Namen (setLastname vs.setSurname).

Alte post, aber ich denke, es ist wichtig zu erwähnen, dass es empfehlenswert ist, um auf Variablen zuzugreifen, die über Getter und setter (ja, mit Punkt-notation).Der Zugriff auf ein Feld direkt (_ivar) wird dringend empfohlen, nur beim initialisieren es.

Es gibt einige gute Apple-Artikel:https://developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html

Letzten Absatz:

Sie sollten immer den Zugriff auf die Instanz-Variablen direkt aus eine Initialisierungs-Methode, weil zu der Zeit eine Eigenschaft festgelegt ist, wird die rest von das Objekt möglicherweise noch nicht vollständig initialisiert wurde.Auch wenn Sie nicht bieten benutzerdefinierte Zugriffsmethoden oder wissen von Nebenwirkungen aus innerhalb Ihrer eigenen Klasse, eine Zukunft Unterklasse kann sehr gut überschreiben Verhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top