2016-08-29 3 views
4

sagen, dass ich die folgenden öffentlichen Methoden in meiner Klasse haben:Warum muss ich das Schlüsselwort @property in objective-c verwenden?

- (BOOL)finished 
{ 
    return _finished; 
} 
- (void)setFinished:(BOOL)aValue 
{ 
    _finished = aValue; 
} 

Muss ich auch als Eigenschaft für die Klasse fertig gesetzt:

@property SomeClass *finished; 

ich @property falsch verstanden haben, aber zu mir scheint es, als würde ich mich wiederholen.

  • Sollten beide Methoden und eine oder nur eine davon deklarieren?
+0

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]; –

+0

'@ property' bedeutet, dass Sie getters und setter-Methoden zuweisen werden,' @ synthesize' erstellt sie für Sie, aber dies sollte jetzt automatisch erfolgen – Knight0fDragon

Antwort

6

Durch ein @property erklärt, wird der LLVM Compiler automatisch „synthetisieren“ Ihre Zugriffsmethoden (Getter und Setter) sowie eine Instanzvariable (ivar), durch einen Unterstrich-Präfix bezeichnet (_finished, zum Beispiel)

In Ihrem Fall gibt es, weil Sie nichts Besonderes mit Ihren Accessoren tun (Sie sind gerade lesen/Schreiben auf die Unterstützung ivar), einfach zu erklären, eine @property wird den Trick tun. Sie werden nicht die -finished und -setFinished Methoden

schreiben müssen, wenn Sie nicht @property deklarieren, werden Sie erklären müssen zeigt Ihre ivar

@property auch Sie mit einem Mitglied Variable eines Objekts arbeiten, und als Benutzer @Sulthan im Kommentar sagt, jede Klasse eine Liste von @properties hält die

Und einen weiteren guten Punkt von demselben Benutzer durchsucht werden kann, macht @property Ihre Accessormethoden atomic, die von Ihrem ivar schützen WHI gelesen werden le es wird geschrieben

+0

Nun, wenn Sie '@ property' ohne irgendwelche Spezifizierer deklarieren, die Getter und Setter werden standardmäßig auf "atomar" gesetzt. Außerdem ist es nicht nur Bequemlichkeit. Jede Klasse enthält eine Liste ihrer Eigenschaften, auf die dynamisch zugegriffen werden kann. Siehe zum Beispiel 'class_copyPropertyList'. Wenn Sie keine Eigenschaft deklarieren, sollten Sie auch die Punktnotation nicht verwenden können (obwohl der Compiler dies normalerweise erlaubt). – Sulthan

+0

Danke für den Kommentar, das sind gute Punkte, ich habe meine Antwort bearbeitet –

+0

@Sulthan Die Punktsyntax ist nichts anderes als eine kurze Hand für Methodenversand. Es hat nichts mit '@ property' zu tun, außer in der gleichen Version des Compilers und der Laufzeit. Das einzige Mal, wo die Punktsyntax nicht verwendet werden kann, ist gegen Methoden, die 'id' zurückgeben oder nehmen (oder Methoden, die überhaupt nichts zurückgeben). – bbum

2

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.

Verwandte Themen