Grund für die Verwendung von ivars vs-Eigenschaften, die in objective c
Habe ich bisher nicht finden alle Informationen zu diesem Thema und das meiste, was ich darüber weiß, ist gekommen, der durch kompletten Zufall (und ein paar Stunden versuchen, um herauszufinden, warum mein code nicht funktioniert). Während das lernen objective-c die meisten tutorials die ich gefunden habe, machen, Variablen und Eigenschaften mit dem gleichen Namen. Ich verstehe nicht die Bedeutung zu, da es scheint, dass die Eigenschaft macht die ganze Arbeit und die variable nur irgendwie sitzt es. Zum Beispiel:
Test.h
@interface Test : NSObject {
int _timesPlayed, _highscore;
}
@property int timesPlayed, highscore;
//Methods and stuff
@end
Test.m
@implementation Test
@synthesize timesPlayed = _timesPlayed;
@synthesize highscore = _highscore;
//methods and stuff
@end
, Was ich weiß,
1) Okay, so habe ich heute gefunden (nach Stunden der Verwirrung) ist, dass, egal, wie viel ändern Sie die Eigenschaften highscore = 5091231
es würde nichts ändern, wenn Sie versuchen, zu nennen [test highscore] als es noch die Rückgabe der Wert der _highscore, die (glaube ich) ist die ivar dieser test.h. Also alle änderungen von Variablen im test.m muss sich ändern _highscore und nicht die highscore. (Korrigiert mich wenn ich hier falsch bitte)
2) Wenn ich es richtig verstehe (ich wahrscheinlich nicht) die ivars set im test.h stellen den eigentlichen Speicher, in dem, wie der @ - Eigenschaften sind nur Möglichkeiten zum Zugriff auf diesen Speicher. Also außerhalb von der Umsetzung habe ich keinen Zugriff auf _highscore ohne den Umweg über die Eigenschaft.
Was ich nicht verstehe
Im Grunde, was ich nicht bekommen, über diese situation ist, ob ich nicht verwenden müssen, die ivars, oder wenn ich einfach die Verwendung von @property und @synthetisieren. Es scheint, wie die ivars sind nur extra code, der nicht wirklich etwas zu tun, sondern verwirren mich. Einige der jüngsten tuts, die ich gesehen habe scheinen nicht zu verwenden, ivars dann aber einige tun. Also das ist nur eine Codierung Präferenz-Sache, oder ist es tatsächlich so wichtig? Ich habe versucht, auf der Suche durch die Dokumentation von Apple, aber ich bekomme ziemlich verloren da und scheinen nie zu finden, was ich Suche. Jede Beratung wird sehr geschätzt.
Ich Suche ich denke, das problem war, dass es so viele Informationen, und einige von Ihnen schien zu widersprechen anderen Antworten.
InformationsquelleAutor CaldwellYSR | 2012-07-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann man sich den syntax für die Synthese von Eigenschaften wie
@synthesize propertyName = variableName
.Dies bedeutet, dass, wenn Sie schreiben
@synthesize highscore = _highscore;
einen neuen ivar-mit den Namen_highscore
für Sie erstellt. Also, wenn Sie wollten, könnten Sie den Zugriff auf die variable, die die Eigenschaft gespeichert ist, die in direkt, indem Sie auf die_highscore
variable.Einige hintergrund
Vor einigen version des Compilers, ich erinnere mich nicht an die Synthese-Anweisung nicht erstellen ivar. Statt es nur gesagt, welche Variablen er verwenden soll, also musste man deklarieren der Variablen und der Eigenschaft. Wenn Sie synthetisiert, die mit einem Präfix Unterstrich dann eine variable benötigt, die die gleiche Vorwahl haben. Jetzt müssen Sie nicht haben, um die variable zu erstellen sich selbst mehr, stattdessen eine variable mit dem
variableName
, die Sie angegeben in der Synthese-Anweisung erstellt wird (wenn Sie nicht schon erklären, es selbst in dem Fall ist es nur als die Unterlage variable der Eigenschaft)., Was Ihr code tut
Werden Sie explizit die Erstellung eines ivar genannt
highscore
bei der Deklaration der Variablen und dann implizit die Schaffung eines anderen namens ivar_highscore
bei der Synthese der Eigenschaft. Diese sind nicht die gleichen Variablen, so dass die Veränderung eines von Ihnen ändert sich nichts über die anderen.Sollten Sie Variablen verwenden, oder nicht?
Dies ist wirklich eine Frage der Präferenz.
Pro Variablen
Einige Menschen sind der Meinung, dass der code wird sauberer, wenn Sie nicht haben, um zu schreiben
self.
alle über dem Platz. Die Leute sagen auch, dass es schneller ist, da es nicht erforderlich ist, eine Methode nennen (obwohl es wahrscheinlich nie gehen zu müssen, um einen messbaren Effekt auf Ihre apps, performance).Pro-Eigenschaften
Ändern des Wertes der Eigenschaft aufrufen, alle notwendigen KVO-Methoden, so dass andere Klassen können sich Benachrichtigen lassen, wenn sich der Wert ändert. Standardmäßig ist der Zugriff auf Eigenschaften ist auch atomic (kann nicht zugegriffen werden von mehr als einem thread), so dass die Eigenschaft ist sicherer zu Lesen und zu schreiben, die von mehreren thread (dies bedeutet nicht, dass das Objekt, das die Eigenschaft verweist, ist thread-sicher, wenn es ein veränderliches array dann mehrere Threads können immer noch brechen die Dinge wirklich schlecht, es wird nur verhindert, dass zwei threads die von der Einstellung der Eigenschaft auf verschiedene Dinge).
Über die Verwendung von Variablen, wenn Ihre app ein Spiel (Häkchen-Methode) oder etwas, das muss sein, genaue Zeit-Weise (Siehe Musik-grade-software), die extra-Aufruf der Methode bedeutet eine Tonne.
Verwendung von Instanz-Variablen (vor allem, wenn deklariert .m/Umsetzung-Datei) hilft Ihnen auch, schnell feststellen, ob etwas einen geerbten Wert oder nicht. Ich finde das extrem wertvoll.
InformationsquelleAutor David Rönnqvist
Können Sie einfach
@property
und@synthesize
ohne Angabe von ivars, wie Sie vorgeschlagen. Das problem oben ist, dass Ihr@synthesize
zugeordnet den Namen der Eigenschaft, um eine neue ivar, der vom compiler generiert wird. So, für alle Absichten und Zwecke, Ihrer Klasse definition ist nun:Zuweisung eines Wertes direkt auf die ivar
timesPlayed
wird nie angezeigt, wenn Sie Zugriff überself.timesPlayed
da Sie nicht ändern Sie die korrekte ivar.Haben Sie mehrere Möglichkeiten:
1 Entfernen Sie die zwei ivars Sie erklärt in Ihrem ursprünglichen Beitrag und lasse den
@property
/@synthesize
dynamische duo Ihr Ding machen.2 Ändern Sie die zwei ivars vorangestellt werden durch einen Unterstrich '_'
3 Ändern Sie Ihre
@synthesize
Aussagen zu:InformationsquelleAutor gschandler
Ich in der Regel nur durch die Verwendung von @property und @synthenize.
@property gibt dem compiler und dem user Anweisungen, wie Ihre Immobilie. Wetter es hat, ein setter, was der setter ist. Welche Art von Wert es erwartet und gibt. Diese Anweisungen werden dann von der autocomplete (und letztlich auch der code, der kompiliert wird vor der Klasse) und von der @synthetisieren
@synthetisieren, wird standardmäßig erstellen Sie eine Instanzvariable mit dem gleichen Namen wie Ihre Immobilie (dies kann verwirrend)
Ich in der Regel die folgenden
dieser wird standardmäßig erstellen Sie eine getter-und eine setter-und Griff den autorelease sowie erstellen der Instanz-Variablen. Die Instanz-variable verwendet wird, ist _propertyItem. wenn Sie möchten, um Zugriff auf die Instanz-variable können Sie verwenden Sie es als solche.
dies ist ein Fehler, tho. Sie sollten immer die getter und setter. dies lässt die app freigeben und erneuern, wie gebraucht.
Dies ist der bessere Weg, es zu handhaben. Und der Grund für die Verwendung der = _propertyItem Abschnitt der zu synthetisieren ist, so dass Sie nicht tun die folgende.
wird es empfohlen, Sie ersetzen es mit _propertyItem. aber Sie sollten selbst.propertyItem statt.
Ich hoffe, diese information hilft.
InformationsquelleAutor The Lazy Coder
In deinem Beispiel
@synthesize timesPlayed = _timesPlayed;
erstellt einen neuen ivar genannt_timesPlayed
und die Eigenschaft bezeichnet, dass ivar.timesPlayed
wird eine völlig separate variable mit keinerlei Verbindung zu dem Grundstück. Wenn Sie nur@synthesize timesPlayed;
dann die Eigenschaft, bezieht sich auftimesPlayed
.Den Zweck der Unterstrich-Konvention ist, um es einfacher, um zu verhindern, dass versehentlich direkt an ein ivar, wenn Sie wollen, es zu tun durch das Eigentum (z.B. durch die setter-Methode synthetisiert). Sie können jedoch immer noch Zugriff _timesPlayed direkt, wenn Sie es wirklich wollen. Die Synthese eine Eigenschaft einfach generiert automatisch eine getter-und setter für das ivar.
Im Allgemeinen brauchen Sie nicht zu deklarieren ivar eine Eigenschaft, zwar gibt es auch spezielle Fälle, wo man es möchte.
InformationsquelleAutor Ethan Holshouser
Kann dies eine alte Frage.. aber in "modern times"
@synthesize
- ist NICHT notwendig.Den
_underscored
sichern ivar synthetisiert WIRD automatisch... und ist in DIESER Klasse die Umsetzung, die direkt (dh. ohne Aufrufself
/Aufruf der automatisch generierten Zugriffsmethoden).Nur müssen zu synthetisieren, wenn Sie unterstützen möchten Unterklasse Zugriff der
_backingIvar
(ohne Aufrufself
), oder für unzähligen anderen Gründen, die anderswo beschrieben.InformationsquelleAutor Alex Gray