Frage

Ich schreibe eine Anwendung, die ausschließlich @properties verwendet.Ich habe in keiner meiner Klassendateien einen einzigen Ivar deklariert.Soweit ich weiß, werden Ivars mit der Einführung von @property nicht mehr benötigt.Programmiere ich nach Best Practice?Wird mir das auf Dauer in den sprichwörtlichen Hintern beißen?Ich habe gemischte Kritiken darüber gelesen, was „richtig“ und „falsch“ ist ...

War es hilfreich?

Lösung

Ich deklariere im Allgemeinen auch keine Ivars. Ich werde es oft verwenden @synthesize foo = foo_; allerdings um den direkten Zugriff zu verhindern, wenn ich die Durch-Methode meinte oder umgekehrt. Und ich lasse den Compiler den Ivar immer automatisch mit dem synthetisieren _ Präfix (das einen versehentlichen direkten Zugriff verhindert, gemäß geschlagen Phrase).

Und wie Caleb sagte, gibt es immer noch Ivars im Umlauf, man deklariert sie nur nicht explizit, es sei denn, man möchte es wirklich (was man eigentlich nicht will, da exponierte Ivars in den Headern für Clients der Klasse nicht nützlich sind). , wenn Ihre API entsprechend gestaltet ist).

Ich finde auch, dass der Hype um „Nur direkten Zugriff in init/dealloc verwenden, Setter/Getter überall sonst verwenden“ weitgehend übertrieben ist und daher überall nur Setter/Getter verwendet werden soll.Die Realität ist, dass Sie bereits unter Druck stehen, wenn Sie während der Initialisierung/Freigabe Beobachter haben;Der Zustand des Objekts ist während der Konstruktion/Zerstörung per Definition undefiniert, und daher kann ein Beobachter möglicherweise nicht richtig über den Zustand urteilen.


Wie Caleb betont, besteht ein weiterer Grund für die Verwendung des direkten Ivar-Zugriffs in init/dealloc darin, Unterklassen zu vermeiden, die benutzerdefinierte Setter/Getter-Logik implementieren, die aufgrund des undefinierten Zustands des Objekts während init/dealloc möglicherweise scheitern.

Auch wenn das wahr sein mag, halte ich es für einen schlimmen Architekturfehler, Setter/Getter mit benutzerdefiniertem Verhalten zu implementieren.Dies ist fragil und macht es deutlich schwieriger, den Code im Laufe der Zeit umzugestalten.Darüber hinaus hängt ein solches benutzerdefiniertes Verhalten häufig von anderen Zuständen innerhalb des Objekts ab, und diese Abhängigkeit führt dann zu Reihenfolgeabhängigkeiten von Zustandsänderungen, die sich in der scheinbaren Einfachheit überhaupt nicht widerspiegeln @property Erklärung.

D.h.wenn Ihre Setter und Getter so geschrieben sind foo.bar = bad; kann nicht ausgeführt werden beliebig Zeit läuft foo, dann ist Ihr Code kaputt.

Andere Tipps

Es ist nicht so sehr, dass Instanzvariablen nicht benötigt werden.Es ist nur diese Instanzvariable Deklarationen nicht erforderlich.Angesichts einer Eigenschaft und einer @synthesize-Anweisung achtet der Compiler, dass die Instanzvariable zusammen mit geeigneten Zugangsmethoden erstellt wird.

Es ist nichts falsch daran, Eigenschaften ausschließlich zu verwenden.Sie vereinfachen das Speichermanagement.Es ist auch nichts falsch daran, Ivars ohne Eigenschaften zu verwenden, wenn Sie das wollen.Wenn Sie Eigenschaften verwenden möchten, aber nicht den Zugangsoren auf den Rest der Welt (dh die Einkapselung aufrechterhalten)/ p>

mithilfe von ivars ist sicherlich nicht falsch, aber Best Practices drängen sich jetzt für die Verwendung von @Property.

Ein Ort, an dem Sie ein IVAR verwenden möchten, ist, wenn Sie ein geschütztes Eigentum deklarieren möchten.Sie erklären das Eigentum in der .m-Datei für eine Klasse und deklarieren Sie den entsprechenden IVAR in der .H mit der @ -vorgewiesenen Richtlinie.Damit können Sie einen geschützten Zugriff in der Unterklasse haben.Es gibt keine Alternative für den geschützten Zugang zu Mitgliedern.

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