Objective-C: @property-Deklaration ohne Implementierung (@synthesize)

8

Soweit ich das verstehe, deklariert @property den Getter und Setter in der .h Datei und @synthesize implementiert den Getter und Setter in den .m Dateien. Außerdem ist es möglich, anstelle von @synthesize eine eigene Implementierung für den Getter und Setter zu schreiben.

Also, wenn wir immer den Setter / Getter implementieren müssen, warum müssen wir es zusätzlich deklarieren? @property scheint für mich semantisch redundant und eine Quelle für Bugs zu sein.

Was passiert, wenn ich eine @property deklariere, aber vergessen, sie mit @synthesize oder manuell zu implementieren? Was passiert, wenn ich @synthesize verwende und die @property-Deklaration vergesse?

    
Stefan Arn 21.09.2011, 08:05
quelle

4 Antworten

26

Eigenschaften werden jetzt standardmäßig synthetisiert, seit Xcode 4.4, also ja, du hast Recht, es war überflüssig und Apple hat die Notwendigkeit beseitigt, @property und @synthesize zu schreiben, benutze ab sofort @property.

    
stephane k. 07.08.2012, 20:12
quelle
6

habe unten in .h Datei

%Vor%

ist syntaktischer Zucker für

%Vor%

in der .h-Datei

und @synthesize in .m ist syntaktischer Zucker, um die eigene Implementierung zu verlassen, indem Sie Ihre retain , nonatomic usw. berücksichtigen, wie in Ihrer Property-Deklaration angegeben.

Sie können nicht mit out @property synthetisieren, auch wenn Sie eine geeignete Getter-, Setter-Signatur in der .h-Datei angegeben haben.

Aber Sie können @ synthesize lassen und Ihren eigenen Getter und Setter implementieren.

Wenn Sie sowohl @synthesize als auch Ihren benutzerdefinierten Getter-Setter verwendet haben, respektiert die Laufzeit Ihre Implementierung und ruft sie auf.

    
Saran 21.09.2011 08:58
quelle
4
  

Was passiert, wenn ich eine @property deklariere, aber vergesse, sie zu implementieren?   mit @synthesize oder manuell? Was passiert, wenn ich @synthesize und   Vergiss die @property-Deklaration?

Warum versuchst du das nicht? Wenn Sie vergessen, die Accessoren zu synthetisieren oder eigene zu erstellen, wird der Compiler Sie warnen. (Und wenn Sie festlegen, dass Warnungen als Fehler behandelt werden, was eine gute Idee ist, ist es unmöglich, die Warnung zu verpassen.) Der zweite Fall führt normalerweise zu einem Kompilierungsfehler.

  

Also, wenn wir den Setter / Getter immer implementieren müssen, warum müssen wir das tun   zusätzlich deklarieren? @property scheint semantisch redundant zu sein   Ich und eine Quelle für Bugs.

Um es einfach auszudrücken: @property ist eine Eigenschaftsdeklaration und @synthesize ist eine mögliche Implementierung. Einer gehört zum Header (= öffentliche Schnittstellenbeschreibung), der andere zur Implementierungsdatei. Wie würdest du es tun, wenn nicht so?

    
zoul 21.09.2011 08:13
quelle
2

Ich wollte nur hinzufügen, dass Sie @dynamic anstelle von @synthesize verwenden können, obwohl dies sehr selten etwas ist, was Sie tun müssen. @dynamic sagt dem Compiler, dass Sie irgendwie sind, um sicherzustellen, dass die Aufrufe an die Getter und Setter zur Laufzeit erledigt werden, entweder indem Sie sie selber machen oder indem Sie etwas extra machen herumspielen mit einigen der speziellen Features der Objective-C-Laufzeit.

    
Matthew Gillingham 21.09.2011 09:14
quelle

Tags und Links