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?
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.
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.
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?
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.
Tags und Links objective-c properties