Ich habe in einigen iPhone-Beispielen gesehen, dass Attribute einen Unterstrich _ vor der Variablen verwendet haben. Weiß jemand was das bedeutet? Oder wie es funktioniert?
Eine von mir verwendete Schnittstellendatei sieht folgendermaßen aus:
@interface MissionCell : UITableViewCell {
Mission *_mission;
UILabel *_missionName;
}
@property (nonatomic, retain) UILabel *missionName;
- (Mission *)mission;
Ich bin mir nicht sicher, was genau das oben genannte tut, aber wenn ich versuche, den Missionsnamen wie folgt festzulegen:
aMission.missionName = missionName;
Ich bekomme den Fehler:
Anfrage für das Mitglied 'missionName' in etwas, das keine Struktur oder Gewerkschaft ist
property
in der h - Datei und in der .m fie ich Zugriff es mitself
wie soself.someProperty
. Ist das der richtige Weg? Oder sollte ich die ivars im Code verwenden?Es ist nur eine Konvention für die Lesbarkeit, es tut dem Compiler nichts Besonderes. Sie werden sehen, dass Benutzer es für private Instanzvariablen und Methodennamen verwenden. Apple empfiehlt tatsächlich, den Unterstrich nicht zu verwenden (wenn Sie nicht vorsichtig sind, können Sie etwas in Ihrer Oberklasse überschreiben), aber Sie sollten sich nicht schlecht fühlen, wenn Sie diesen Rat ignorieren. :) :)
quelle
Der einzige nützliche Zweck, den ich gesehen habe, ist die Unterscheidung zwischen lokalen Variablen und Mitgliedsvariablen, wie oben angegeben, aber es ist keine notwendige Konvention. In Kombination mit einer @ -Eigenschaft erhöht sich die Ausführlichkeit der Synthetisierungsanweisungen -
@synthesize missionName = _missionName;
und ist überall hässlich.Verwenden Sie anstelle des Unterstrichs nur beschreibende Variablennamen in Methoden, die nicht in Konflikt stehen. Wenn sie in Konflikt geraten müssen, sollte der Variablenname innerhalb der Methode einen Unterstrich aufweisen, nicht die Mitgliedsvariable, die von mehreren Methoden verwendet werden kann . Dies ist nur in einem Setter oder in einer Init-Methode üblich. Darüber hinaus wird die Anweisung @synthesize präziser.
Bearbeiten: Mit der neuesten Compiler-Funktion der Autosynthese verwende ich jetzt den Unterstrich für den ivar (in seltenen Fällen muss ich einen ivar verwenden, um den Funktionen der Autosynthese zu entsprechen.
quelle
Es hat eigentlich nichts zu bedeuten, es ist nur eine Konvention, mit der manche Leute Mitgliedsvariablen von lokalen Variablen unterscheiden.
Der Fehler scheint, als hätte aMission den falschen Typ. Was ist es seine Erklärung?
quelle
Dies gilt nur für die Namenskonvention zum Synthetisieren von Eigenschaften.
Wenn Sie Variablen in der .m-Datei synthetisieren, liefert Xcode automatisch _variable Intelligenz.
quelle
Mit einem Unterstrich können Sie nicht nur Ihre ivars auflösen, ohne auf die self.member- Syntax zurückgreifen zu müssen, sondern Ihren Code auch besser lesbar machen, da Sie wissen, wann eine Variable ein ivar (aufgrund ihres Unterstrichpräfixes) oder ein Elementargument (kein Unterstrich) ist ).
Beispiel:
quelle
self.image
, die auf die Eigenschaft zugreift. Das einzige Mal, wenn Sie_image
direkt auf die Instanzvariable zugreifen sollten , liegt innerhalb voninit
Methoden und derdealloc
Methode, wenn das Aufrufen einer anderen Methode riskant sein kann (da das Objekt halb initialisiert oder halb freigegeben ist).Dies scheint das "Master" -Element für Fragen zu self.variableName vs. _variablename zu sein. Was mich für eine Schleife warf, war, dass ich in der .h hatte:
Dies führt dazu, dass self.variableName und _variableName zwei unterschiedliche Variablen in der .m sind. Was ich brauchte war:
Dann sind in der Klasse '.m self.variableName und _variableName äquivalent.
Was mir immer noch nicht klar ist, ist, warum viele Beispiele immer noch funktionieren, auch wenn dies nicht schwierig ist.
Strahl
quelle
Anstelle eines Unterstrichs können Sie den Namen self.variable verwenden oder die Variable synthetisieren, um die Variable oder den Ausgang ohne Unterstrich zu verwenden.
quelle
In den anderen Antworten fehlt, dass die Verwendung
_variable
verhindert , dass Sie geistesabwesendvariable
den ivar eingeben und darauf zugreifen, anstatt auf die (vermutlich beabsichtigte) Eigenschaft.Der Compiler zwingt Sie, entweder
self.variable
oder zu verwenden_variable
. Die Verwendung von Unterstrichen macht die Eingabe unmöglichvariable
, wodurch Programmiererfehler reduziert werden.quelle