Sogar dort ist eine akzeptierte Antwort, ich denke, dass einige Informationen und Erläuterungen hinzugefügt werden müssen.
A. tut nicht synthetisieren nichts. Es ist eine Methodendeklaration. Zeitraum. Dies ist der Grund, warum es in Protokollen erlaubt ist. (Methode Implementierungen ist nicht erlaubt, auch nicht möglich, in den Protokollen.)
Was die Leute lassen denken, dass die Tatsache ist, dass, wenn Sie nicht all implementieren erforderlich Accessoren manuell, der Compiler implizit ein @synthesize
in der Implementierung übernimmt und das synthetisierte die Accessoren.
Aber ja, eine implizite oder explizite @synthesize
erfordert . (Aber nicht andersherum!)
B. Mit müssen Sie auch einen ivar deklarieren, wenn Sie explizit die benötigten Accessoren definieren. Dies liegt daran, dass die implizite Synthese in einem solchen Fall "ausschaltet" (aus guten Gründen).
C. Neben der Bequemlichkeit gibt es einen echten Vorteil von : Es fügt semantische Informationen zu der Eigenschaft. Neben der Bündelung von Getter und Setter (was ist der Getter für -setFinished:
? -isFinished
?-finished
) es enthält Informationen über Kopieren und Referenzstärke (weak
, strong
, copy
). Atomarität ist weniger wichtig, da in den meisten Fällen die Atomizität des Zugriffs nicht dazu beiträgt, Probleme der gleichzeitigen Ausführung zu lösen.
Wenn Sie die BOOL-Variable als @property BOOL (nichtatomisch) als abgeschlossen deklarieren; müssen Sie nicht die Setter-Methode schreiben, um sie zu setzen, Sie können einfach [yourClass setFinished: YES]; –
'@ property' bedeutet, dass Sie getters und setter-Methoden zuweisen werden,' @ synthesize' erstellt sie für Sie, aber dies sollte jetzt automatisch erfolgen – Knight0fDragon