override Getter benötigt nur @synthesize

7

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.

    
Greg Leszek 11.12.2013, 15:07
quelle

3 Antworten

16

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).

    
Rob 11.12.2013, 15:11
quelle
5

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.

    
bbum 11.12.2013 15:24
quelle
0

In iOS 7 müssen Sie normalerweise nicht synthetisieren. Wenn Sie einen benutzerdefinierten Getter möchten, definieren Sie einfach einen. Sie erhalten den Standard-Setter kostenlos.

    
blackbird 11.12.2013 15:12
quelle