Synthesize , Property, Attribute

  • Synthesize , Property, Attribute

    Bei dem Thema sind sich ja eigentlich immer so gut wie einig.
    Ich würde das mein Verständnis dafür nur einmal stärken wollen und dann so aufnehmen ;)
    vielleicht kann man das Thema dann auch für Neuankömmlinge verlinken

    Synthesize:
    Seit Xcode 4.5 ist eine benutzung von Synthesize nicht mehr notwendig (außer man implementiert beide Accessoren selbst)
    1. Nutzt ihr noch Synthesize? Weil ihr noch mit Compilern vor LLVM 4.1 arbeitet? oder weil ihr euch einfach dran gewöhnt habt? oder nur wenn ihr die Accessoren überschreibt?

    Für Public - Propertys:
    Um die Accessoren nicht selber schreiben zu müssen, nutzt man Propertys, im vergleich zu früheren Version vom Compiler/Xcode in denen man noch eine Attributdeklaration in die .h seiner Klasse geschrieben hat, was jedoch gegen das Geheimhaltungsprinzip verstößt. da der Zugriff über das Attribut einen direkten Zugriff zur Folge hat und kein Zugriff über die Accessoren erfolgt. Damit andere Objekte auf "Inhalte" eines Objektes zugreifen können werden diese Propertys in die .h der Klasse geschrieben, somit sind diese so zu sagen public und ein Zugriff von außen erfolgt über die Accessoren. Möchte man dann in der .m damit arbeiten greift man per self.propertyName auf entsprechendes zu Zusätzlich kann man die Propertys für andere Sachen nutzen wie zB KVO
    2. Das sollte ja soweit korrekt sein oder?

    Für Private Propertys vs.Attribute:
    Um in der .m einer Klasse auch arbeiten zu können sind mit großer Wahrscheinlichkeit auch mehrere Variablen nötig, die aber unter Umständen nicht Public sein müssen oder sogar auch gar nicht Public sein sollen, somit haben diese dann nichts als Property in der .h der Klasse zu suchen.
    Da in der .m nicht das Geheimhaltungsprinzip verletzt werden würde könnte man hier eine Attributendeklaration verwenden. Innerhalb der .m erfolgt der Zugriff auf die Privates dann direkt und ohne Accessoren. Alternativ zur Attributdeklaration kann in der .m auch ein Interface geschrieben werden in dem auch Propertys angelegt werden und diese dann wie die Propertys aus der .h verwendet werden. Also per
    self.propertyName (was ein Zugriff per Accessorenist) oder per _propertyName (wenn kein synthesize genutzt wird, bzw. entsprechender Name bei der Verwendung von Synthesize) was aber einen direkten Zugriff zur Folge hat und keine Verwendung von Accessoren.
    3. Das sollte soweit auch korrekt sein?
    4. Auch bei Private sollte man die Accesoren per self. verwenden? oder ist das bei private vollkommen egal weil wenn man die Accessoren eh nicht selber implementiert hat ein direkter Zugriff den gleichen Effekt wie self. ?

    Ich weiß nicht immer wovon ich rede aber ich weiß das ich Recht habe. :saint:
  • Ich nutze grundsätzlich properties für alles was nicht nur lokal in einer Methode verwendet werden soll. Dabei mache ich es so wie oben beschrieben, dass ich private Attribute im Interface der .m deklariere.
    Das Ganze hat für mich den großen Vorteil, dass wenn ich im späteren Verlauf feststelle, dass ich zu diesem Attribut vielleicht doch einen speziellen Getter oder Setter brauche oder das Attribut doch mal einen Observer braucht ich das innerhalb von Sekunden hinzugefügt habe. Weiterhin kann ich auf die Art sehr leicht mit auch mit mehreren Threads auf diese zugreifen, weil sie threadsafe sind solange ich sie nicht explizit nonatomic deklariere.

    In einer ivar sehe ich nirgendwo einen wirklichen Vorteil. Einzige Ausnahme wären hier sehr zeitkritische Routinen.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • nussratte schrieb:

    1. Nutzt ihr noch Synthesize? Weil ihr noch mit Compilern vor LLVM 4.1 arbeitet? oder weil ihr euch einfach dran gewöhnt habt? oder nur wenn ihr die Accessoren überschreibt?

    Ich nutze @synthesize nur noch dann, wenn es notwendig ist; z. B. bei selbstgeschriebenen Accessoren oder um dem Attribut einen anderen Namen zu geben.

    nussratte schrieb:

    2. Das sollte ja soweit korrekt sein oder?

    KVC und KVO funktioniert auch ohne Propertys.

    nussratte schrieb:

    3. Das sollte soweit auch korrekt sein?

    Private Propertys deklariert man in der anonymen Kategorie der Klasse.

    nussratte schrieb:

    4. Auch bei Private sollte man die Accesoren per self. verwenden? oder ist das bei private vollkommen egal weil wenn man die Accessoren eh nicht selber implementiert hat ein direkter Zugriff den gleichen Effekt wie self. ?

    Ob ein direkter Zugriff den gleichen Effekt wie der direkte Zugriff hat, hängt von der Implementierung der Accessoren ab. (Private) Propertys machen in der Regel wenig Sinn, wenn man für den Zugriff nicht die Accessoren verwendet. Wenn ich unbedingt direkt auf das Attribut zugreifen will, wozu brauche ich dann die Accessoren bzw. die Propertys?
    „Meine Komplikation hatte eine Komplikation.“
  • erstmal danke für die antworten

    macmoonshine schrieb:

    KVC und KVO funktioniert auch ohne Propertys.

    das werde ich mir dann auch noch mal anschauen

    macmoonshine schrieb:

    Private Propertys deklariert man in der anonymen Kategorie der Klasse.

    danke für die Richtigstellung bzw Ergänzung

    es ist zwar eig nicht das Thema, aber wo annonyme Kategorien schon angesprochen wurden
    für welchen Fall macht es Sinn in einer annonymen Kategorie Methoden zu deklarieren?
    bei Propertys erkenne ich den Vorteil.
    bei Methoden nicht so recht, da diese dann private sind und von außen eh nicht gesehen werden können, können diese doch auch einfach nur in den implementation Teil geschrieben werden
    Ich weiß nicht immer wovon ich rede aber ich weiß das ich Recht habe. :saint:
  • nussratte schrieb:

    erstmal danke für die antworten

    macmoonshine schrieb:

    KVC und KVO funktioniert auch ohne Propertys.

    das werde ich mir dann auch noch mal anschauen

    macmoonshine schrieb:

    Private Propertys deklariert man in der anonymen Kategorie der Klasse.

    danke für die Richtigstellung bzw Ergänzung

    es ist zwar eig nicht das Thema, aber wo annonyme Kategorien schon angesprochen wurden
    für welchen Fall macht es Sinn in einer annonymen Kategorie Methoden zu deklarieren?
    bei Propertys erkenne ich den Vorteil.
    bei Methoden nicht so recht, da diese dann private sind und von außen eh nicht gesehen werden können, können diese doch auch einfach nur in den implementation Teil geschrieben werden


    das hat man "früher" teilweise so gemacht weil der compiler methoden die unter einer aufrufenden methode standen nicht "gesehen" wurden. ist jetzt aber nicht mehr nötig.