132 votes

erreur: écriture atomique des biens de la paire a synthétisé setter/getter avec un définis par l'utilisateur setter/getter

Récemment, j'ai essayé de compiler un vieux projet Xcode (qui sert à compiler très bien), et maintenant, je vois beaucoup d'erreurs de ce formulaire:

error: writable atomic property 'someProperty' cannot pair a synthesized setter/getter with a user defined setter/getter

Le modèle de code qui sont les causes de ces erreurs de toujours ressemble à ceci:

// Interface:

@property (retain) NSObject * someProperty;

// Implementation:

@synthesize someProperty; // to provide the getter
- (void)setSomeProperty:(NSObject *)newValue
{
    //..
}

Je peux voir pourquoi le message d'erreur est généré. - Je dire au compilateur de synthétiser mes accesseurs de propriété (à la fois les méthodes getter et setter), et puis tout de suite après je remplace le setter manuellement. Ce code a toujours senti un peu à l'écart.

Alors, quelle est la bonne façon de le faire? Si j'utilise @dynamic au lieu de @synthesize,, je vais avoir à écrire de la lecture. Est-ce la seule?

224voto

octy Points 4735

J'ai eu le même problème et après avoir fait un peu de recherche, voici ma conclusion sur cette question:

Le compilateur vous met en garde contre une @property que vous avez déclaré comme atomique (c'est à dire en omettant l' nonatomic mot-clé), encore vous offrir une mise en œuvre incomplète de la façon de synchroniser l'accès à la propriété.

Pour faire cette mise en garde disparaître:

Si vous déclarez une @property atomique puis effectuez l'une des opérations suivantes:

  • utiliser @dynamic , ou;
  • utiliser @synthesize et de garder la synthèse setter et getter ou;
  • fournir un manuel de mise en œuvre de deux le setter et getter (sans l'aide de l'une des directives ci-dessus).

Si vous déclarez l' @property avec (nonatomic) alors vous pouvez mélanger manuel et synthétisé les implémentations de getters et setters.

Mise à jour: Une Note sur la Propriété d'Auto-Synthèse

Comme de LLVM 4.0, CLang fournit auto-synthèse de l'déclaré propriétés qui ne sont pas @dynamic. Par défaut, même si vous quittez l' @synthesize, le compilateur va fournir les méthodes getter et setter pour vous. Toutefois, la règle pour les propriétés atomiques est toujours le même: Soit laisser le compilateur fournir à la fois le getter et le setter, OU de les mettre en œuvre à la fois de vous-même!

14voto

arturgrigor Points 1850

Vous avez besoin de mettre en œuvre la lecture aussi. Exemple:

// Interface:

@property (retain) NSObject * someProperty;

// Implementation:

- (void)setSomeProperty:(NSObject *)newValue
{
    @synchronized (self)
    {
        // ...
    }
}

- (NSObject *)someProperty
{
    NSObject *ret = nil;

    @synchronized (self)
    {
        ret = [[someProperty retain] autorelease];
    }

    return ret;
}

12voto

Matias Forbord Points 151

Cette question, parmi les autres top hits que vous obtenez de la recherche pour "objectif C de la propriété personnalisée", ne sont pas mis à jour avec les informations à propos de "poseur =" ou "getter =".

Donc, pour la fourniture de plus d'informations sur cette question:

Vous pouvez fournir les @property appel avec votre propre méthode par écrit

    @property(setter = MySetterMethod:, getter = MyGetterMethod)

Avis du côlon fourni méthode d'initialisation.

Référence dans la documentation d'Apple

EDIT: Je ne suis pas tout à fait sûr de savoir comment les nouvelles modifications de l'Objective-C propriétés (ils sont beaucoup plus intelligents maintenant) modifier les réponses à cette question. Peut-être qu'il devrait tous être marqué comme obsolète.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X