2010-02-11 4 views
3

J'utilise le code suivant pour ajouter une méthode displayValue à NSObject:Comment ajouter une propriété à NSObject dans Objective-C?

@interface NSObject (MyNSObjectAdditions) 
- (NSString*)displayValue; 
@end 


@implementation NSObject (MyNSObjectAdditions) 
- (NSString*)displayValue { 
    return self.description; 
} 
@end 

Cela fonctionne très bien, mais vraiment je préfère avoir valeurAffichée être une propriété en lecture seule au lieu d'une méthode.

Quelle serait la syntaxe appropriée pour convertir displayValue en une propriété au lieu d'un sélecteur, si c'est même possible?

Répondre

4

Vous pouvez uniquement ajouter de nouvelles méthodes à une classe en utilisant des catégories. Si vous voulez vraiment ajouter de nouvelles variables d'instance, vous devrez sous-classer NSObject.

Dans tous les cas, ajouter des fonctionnalités à NSObject est rarement une bonne idée. Pouvez-vous expliquer ce que vous essayez d'accomplir?

+4

Je ne suis pas d'accord avec vous. J'ai ajouté beaucoup de catégories à NSObject. C'est une option parfaitement valide pour ajouter du comportement à peu près tout dans votre arbre de classe à la fois. Vous avez juste besoin de faire attention à ne pas noyer les méthodes existantes. – NSResponder

+1

Également en désaccord avec l'autre point. Si vous souhaitez ajouter de nouvelles variables d'instance sans sous-classe, vous pouvez utiliser cette technique: [Objective-C: ajout d'attribut à une catégorie] (http://stackoverflow.com/q/4597637/1804403) – Skotch

+0

Objets associés ('objc_ { get, set} AssociatedObject') peut être utilisé comme un remplacement entièrement fonctionnel de l'ajout dynamique de variables d'instance aux objets. –

2

On dirait que votre méthode -displayValue n'ajoute rien à -description. Pourquoi veux-tu faire cela?

+0

Par défaut -displayValue retourne -description, mais faire cela me permet de sous-classe -displayValue dans d'autres objets sur une base au cas par cas. – emmby

+0

Pourquoi ne pas simplement remplacer la description au cas par cas? – bobDevil

+0

Parce que la description dominante a des effets profonds. D'autres parties du code peuvent se baser sur des descriptions sorties d'une manière particulière et je ne veux pas changer ça. D'ailleurs, conceptuellement je ne change pas vraiment ce qu'un objet devrait "ressembler", juste comment il devrait être rendu dans ce module particulier (qui produit le html dans cet exemple). – emmby

3

Vous pouvez avoir des propriétés dans les catégories. Dans les catégories qui ne sont pas class extensions (continuations de classe AKA), vous ne pouvez pas utiliser @synthesize. Cependant, il est simple d'écrire des méthodes de sauvegarde à la place. Dans votre cas, cela fonctionne:

@interface NSObject (MyNSObjectAdditions) 
@property (readonly) NSString *displayValue; 
@end 

@implementation NSObject (MyNSObjectAdditions) 

- (NSString *)displayValue { 
    return self.description; 
} 

@end 
Questions connexes