J'ai récemment essayé de compiler un ancien projet Xcode (qui compilait très bien), et maintenant je vois beaucoup d'erreurs de cette forme:
error: writable atomic property 'someProperty' cannot pair a synthesized setter/getter with a user defined setter/getter
Le modèle de code qui provoque ces erreurs ressemble toujours à ceci:
// Interface:
@property (retain) NSObject * someProperty;
// Implementation:
@synthesize someProperty; // to provide the getter
- (void)setSomeProperty:(NSObject *)newValue
{
//..
}
Je peux voir pourquoi l'erreur est générée. Je dis au compilateur de synthétiser mes accesseurs de propriété (getter et setter), puis immédiatement après je remplace le setter manuellement. Ce code a toujours senti un peu mauvais.
Alors, quelle est la bonne façon de faire cela? Si j'utilise à la @dynamic
place de @synthesize
, je devrai également écrire le getter. Est-ce le seul moyen?
atomic
propriétés? Dans le cas de propriétés atomiques, il peut être judicieux de synchroniser la paire getter / setter en ce qui concerne la stratégie de verrouillage. Ceci est difficile si une partie est synthétisée tandis que l'autre est du code personnalisé.Réponses:
J'ai eu le même problème et après avoir fait un peu de recherche, voici ma conclusion sur ce problème:
Le compilateur vous avertit de a
@property
que vous avez déclaré comme atomique (c'est-à-dire en omettant lenonatomic
mot - clé), mais vous fournissez une implémentation incomplète de la façon de synchroniser l'accès à cette propriété.Pour faire disparaître cet avertissement:
Si vous déclarez que a
@property
est atomique, effectuez l'une des opérations suivantes:@dynamic
ou;@synthesize
et conserver le setter et le getter synthétisés ou;Si vous déclarez le
@property
avec,(nonatomic)
vous pouvez mélanger des implémentations manuelles et synthétisées des getters et des setters.Mise à jour: une note sur l'auto-synthèse des propriétés
Depuis LLVM 4.0, CLang fournit une synthèse automatique pour les propriétés déclarées qui ne le sont pas
@dynamic
. Par défaut, même si vous omettez le@synthesize
, le compilateur vous fournira les méthodes getter et setter. Toutefois, la règle des propriétés atomiques est toujours le même: soit laisser le compilateur fournir à la fois le getter et le setter ou les mettre en œuvre à la fois vous - même!la source
Vous devez également implémenter le getter. Exemple:
la source
Cette question, parmi les autres meilleurs résultats que vous obtenez en recherchant "propriété personnalisée de l'objectif C", n'est pas mise à jour avec des informations sur "setter =" ou "getter =".
Donc, pour fournir plus d'informations sur cette question:
Vous pouvez fournir l'appel @property avec votre propre méthode en écrivant
Notez les deux points pour la méthode setter fournie.
Documentation de référence Apple
EDIT: Je ne sais pas trop comment les nouvelles modifications apportées aux propriétés d'Objective-C (elles sont beaucoup plus intelligentes maintenant) changent les réponses à cette question. Peut-être que tout devrait être marqué comme obsolète.
la source
Pour les autres qui obtiennent cette erreur pas pour la raison décrite par OP, vous rencontrez probablement le même problème que moi:
Vous avez une propriété @ avec le même nom qu'une méthode - ().
Quelque chose comme ça:
la source