Wie überschreibe ich @synthesized Getter?

75

Wie überschreibe ich einen eigenschaftssynthetisierten Getter?

Simone D'Amico
quelle
2
Dies ist weder für iPhone noch für iOS spezifisch. Es ist nicht einmal spezifisch für eine Plattform oder ein Framework.
"Override" hat in OOP und Objective-C eine spezifische Bedeutung. Leider meinen Sie wahrscheinlich etwas anderes: "Wie kann man verhindern, dass ein Getter synthetisiert und stattdessen manuell implementiert wird?" Wenn ich Sie richtig interpretiere, haben Sie die falsche Antwort akzeptiert.
Nikolai Ruhe
2
@ user142019: Warum ist das wichtig?
Stewart Macdonald

Antworten:

55

Innerhalb Ihrer Eigenschaftsdefinition können Sie Getter- und Setter-Methoden wie folgt angeben:

@property (nonatomic, retain, getter = getterMethodName, setter = setterMethodName) NSString *someString;

Sie können nur den Getter, nur den Setter oder beides angeben.

Diadyne
quelle
Wie kann man nur Getter / nur Setter angeben?
Pedro Rolo
In meinem Xcode-Projekt muss ich someString nicht @synthesize. Wie kann ich in diesem Fall den Wert festlegen? Xcode Fehler sagt, dass das eine nicht deklarierte Eigenschaft ist. Thx
Herr Frank
5
@ Mr.Frank: Xcode führt jetzt standardmäßig die automatische Synthese von Eigenschaften durch. Dies wurde in einer der Xcode-Versionen (4.5?) Hinzugefügt. Im Grunde genommen müssen Sie @synthesizeIhre Variablen nicht mehr verwenden, Sie benötigen nur noch die @propertyund dort müssen Sie nur noch Ihren Getter und / oder Setter angeben.
Matsr
76

Implementieren Sie die Methode einfach manuell, zum Beispiel:

- (BOOL)myBoolProperty
{
    // do something else
    ...
    return myBoolProperty;
}

Der Compiler generiert dann keine Getter-Methode.

Ole Begemann
quelle
12
Beachten Sie, dass Sie, wenn dies der Fall @propertyist atomic(Standardeinstellung), einen @synthesizeGetter / Setter nicht korrekt mit einem manuell geschriebenen Getter / Setter mischen können .
bbum
12
Angst wovor? atomicnicht ist , dass nützlich; Es wird nichts unternommen, um die Datenintegrität in einer Thread-Anwendung zu gewährleisten. Es verhindert lediglich, dass eine App aufgrund einer offensichtlichen Rennbedingung abstürzt. Wenn Sie sich atomicstark verlassen, machen Sie es fast sicher falsch ... :)
bbum
2
@bbum: Könnten Sie näher erläutern, was Sie unter "Sie können einen synthetisierten Getter / Setter nicht korrekt mit einem manuell geschriebenen Getter / Setter mischen" verstehen, wenn die Eigenschaft atomar ist? Ich verstehe nicht, was das eine mit dem anderen zu tun hat. Vielen Dank.
Ole Begemann
6
Sicher; stackoverflow.com/questions/588866/… kann hilfreich sein. Da der zu implementierende Verriegelungsmechanismus atomicnicht freigelegt ist, können Sie nicht nur den Setter oder nur den Getter manuell implementieren und die Atomizität mit einem @synthesized- atomicSetter / Getter sicherstellen .
bbum
1
Wenn Sie eine solche Getter-Methode schreiben, wird die Eigenschaft dann automatisch schreibgeschützt? Wenn nicht, wo werden die Daten gespeichert, wenn der Eigenschaft ein Wert zugewiesen wird?
matthias_buehlmann
43

Implementieren Sie einfach Ihren eigenen Getter und der Compiler generiert keinen. Gleiches gilt für Setter.

Zum Beispiel:

@property float value;

ist äquivalent zu:

- (float)value;
- (void)setValue:(float)newValue;
stefanB
quelle
11

Ich möchte nur hinzufügen, ich konnte die BOOL-Eigenschaft nicht mit getter / setter überschreiben, bis ich Folgendes hinzufüge:

@synthesize myBoolProperty = _myBoolProperty;

Der vollständige Code lautet also:

in der Header-Datei:

@property  BOOL myBoolProperty;

in der Implementierungsdatei:

@synthesize myBoolProperty = _myBoolProperty;


-(void)setMyBoolProperty:(BOOL) myBoolPropertyNewValue
{
    _myBoolProperty = myBoolPropertyNewValue;
}

-(BOOL) myBoolProperty
{
    return _myBoolProperty;
}
user1105951
quelle