Ich habe kürzlich versucht, ein älteres Xcode-Projekt zu kompilieren (das früher einwandfrei kompiliert wurde), und jetzt sehe ich viele Fehler in dieser Form:
error: writable atomic property 'someProperty' cannot pair a synthesized setter/getter with a user defined setter/getter
Das Codemuster, das diese Fehler verursacht, sieht immer so aus:
// Interface:
@property (retain) NSObject * someProperty;
// Implementation:
@synthesize someProperty; // to provide the getter
- (void)setSomeProperty:(NSObject *)newValue
{
//..
}
Ich kann sehen, warum der Fehler generiert wird. Ich fordere den Compiler auf, meine Eigenschafts-Accessoren (sowohl Getter als auch Setter) zu synthetisieren, und überschreibe den Setter unmittelbar danach manuell. Dieser Code hat immer ein wenig gerochen.
Also, was ist der richtige Weg, um dies zu tun? Wenn ich @dynamic
anstelle von verwende @synthesize
, muss ich auch den Getter schreiben. Ist das der einzige Weg?
atomic
Eigenschaften vor? Bei atomaren Eigenschaften ist es möglicherweise eine gute Idee, das Getter / Setter-Paar in Bezug auf die Sperrstrategie synchron zu halten. Dies ist schwierig, wenn ein Teil synthetisiert wird, während der andere benutzerdefinierter Code ist.Antworten:
Ich hatte das gleiche Problem und nach ein wenig Recherche ist hier meine Schlussfolgerung zu diesem Thema:
Der Compiler warnt Sie vor einem
@property
, den Sie als atomar deklariert haben (dh indem Sie dasnonatomic
Schlüsselwort weglassen ). Sie bieten jedoch eine unvollständige Implementierung zum Synchronisieren des Zugriffs auf diese Eigenschaft.Um diese Warnung verschwinden zu lassen:
Wenn Sie a
@property
als atomar deklarieren , führen Sie einen der folgenden Schritte aus:@dynamic
oder;@synthesize
und behalte den synthetisierten Setter und Getter oder;Wenn Sie das
@property
mit deklarieren(nonatomic)
, können Sie manuelle und synthetisierte Implementierungen von Gettern und Setzern mischen.Update: Ein Hinweis zur automatischen Eigenschaftssynthese
Ab LLVM 4.0 bietet CLang eine automatische Synthese für deklarierte Eigenschaften, die dies nicht sind
@dynamic
. Selbst wenn Sie das weglassen@synthesize
, stellt der Compiler standardmäßig Getter- und Setter-Methoden für Sie bereit. Die Regel für atomare Eigenschaften ist jedoch immer noch dieselbe: Entweder lassen Sie den Compiler sowohl den Getter als auch den Setter bereitstellen , oder implementieren Sie beide selbst!quelle
Sie müssen den Getter auch implementieren. Beispiel:
quelle
Diese Frage wird neben den anderen Top-Treffern, die Sie bei der Suche nach "benutzerdefinierten Eigenschaften für Ziel C" erhalten, nicht mit Informationen zu "setter =" oder "getter =" aktualisiert.
Um weitere Informationen zu dieser Frage zu erhalten:
Sie können den Aufruf von @property mit Ihrer eigenen Methode versehen, indem Sie schreiben
Beachten Sie den Doppelpunkt für die mitgelieferte Setter-Methode.
Referenz Apple-Dokumentation
EDIT: Ich bin mir nicht ganz sicher, wie die neuen Änderungen an den Eigenschaften von Objective-C (sie sind jetzt viel intelligenter) die Antworten auf diese Frage ändern. Vielleicht sollte alles als veraltet markiert sein.
quelle
Für andere, die diesen Fehler nicht aus dem beschriebenen OP-Grund erhalten, haben Sie wahrscheinlich das gleiche Problem wie ich:
Sie haben eine @ -Eigenschaft mit demselben Namen wie eine - () -Methode.
Etwas wie das:
quelle