Ich möchte Getter für faule Instanziierung überspielen und den Default-Setter belassen.
Benötige ich @synthesize?
Warum?
%Vor%Update: Ich habe die Variable und den Klassennamen geändert, weil das verwirrend war. Von Deck und Karte zu Foo und Bar.
Nein, Sie müssen nur explizit synthetisieren (um den synthetisierten Ivar zu erhalten), wenn Sie explizit alle Accessor-Methoden implementieren (Getter und Setter für readwrite
-Eigenschaften, nur Getter für readonly
-Eigenschaften). Sie haben den Getter für diese readwrite
-Eigenschaft geschrieben, aber nicht für den Setter, damit der ivar noch für Sie synthetisiert wird. So, wie Ihr Code steht, müssen Sie nicht ausdrücklich @synthesize
.
Wenn Sie diese Eigenschaft readonly
festgelegt haben, verhindert die Implementierung eines GETTERs, dass Ihr ivar automatisch synthetisiert wird. Ebenso, da dies readwrite
ist, müssten Sie, wenn Sie sowohl den Getter als auch den Setter implementiert haben, den Ivar synthetisieren (falls Sie einen wollten).
Verwenden Sie auf diese Weise keine verzögerte Initialisierung. Ein Deck ist ohne Karten nutzlos, und daher erwirbt die faule Initialisierung nichts als einen unbestimmten CPU-Verbrauch, wenn der erste Aufruf dieses Getters erfolgt. Glücklicherweise verursacht das einfache Erstellen eines veränderbaren Arrays nichts (was auch ein Grund dafür ist, keine faule Initialisierung zu verwenden).
Auch das Verkaufen einer veränderbaren Sammlung bricht die Kapselung. Ein Deck sollte die gesamte Logik enthalten, um zu bestimmen, welcher Kartensatz in welcher Reihenfolge enthalten ist. Durch den Verkauf einer veränderbaren Sammlung kann ein externer Code die Reihenfolge hinter dem Deck ändern.
Darüber hinaus, was bedeutet es sogar, die Karten eines Decks zu "setzen"? Der Weg dorthin führt scheinbar dazu, dass die gesamte Logik des Decks außerhalb der Deck-Klasse liegt und die Frage aufgeworfen wird, warum das Deck nichts anderes als ein einfaches altes Array in welcher Klasse das Deck ist.
Tags und Links objective-c xcode5 getter-setter synthesize