2016-06-30 1 views
1

I défini une catégorie pour NSDictionarydéclare variable d'instance dans la catégorie

NSDictionary + AddMyFunc.m

// Compiler error: expected identifier or '(' 
@implementation NSDictionary (AddMyFunc) { 
    NSInteger myNum; 
} 

- (void)myFunc { 
    //Compiler error: use of undeclared identifier 'myNum' 
    myNum = //some operation 
} 

@end 

Je veux définir une variable instance myNum, je l'ai fait bien au-dessus, mais j'ai eu des erreurs de compilation montrant ci-dessus. Pourquoi je reçois ces erreurs, comment s'en débarrasser?

+0

Pourquoi downvote? Je ne peux pas trouver une réponse sur internet, alors je demande ici, quel est le problème avec ça? Il pourrait y avoir d'autres personnes ont la même confusion comme moi. Explication sur la question est meilleure que downvote. –

Répondre

0

Les variables d'instance ne sont pas prises en charge dans les catégories. Cela est logique si vous savez ce qu'est réellement une instance et comment le stockage est alloué. Étant donné que les catégories peuvent être chargées dans n'importe quel ordre, le compilateur et l'éditeur de liens n'auraient aucune possibilité de savoir quelle serait l'adresse de la variable d'instance.

Si vous devez imiter des propriétés, utilisez les objets associés.

0

Vous pouvez ajouter des propriétés à la catégorie en utilisant l'objet associé

#import <objc/runtime.h> 

static const void *ImageTagKey = &ImageTagKey; 

@implementation UIImage (Tagged) 

- (void)setTag:(NSSting *)tag 
{ 
    objc_setAssociatedObject(self, ImageTagKey, tag, OBJC_ASSOCIATION_COPY_NONATOMIC); 
} 

- (NSString *)tag 
{ 
    return objc_getAssociatedObject(self, ImageTagKey); 
} 

@end 
1

Vous essayez d'utiliser extension de classe caractéristique de l'injection variables d'instance avec une catégorie, où cette fonction n'est pas disponible. Les extensions de classe sont plus puissantes que les catégories, mais elles ne peuvent pas être ajoutées aux classes d'autres personnes.

Pour ajouter une propriété qui agit comme une variable d'instance à votre catégorie, utiliser des objets associés, comme ceci:

@interface NSDictionary (AddMyFunc) 
@property (nonatomic, assign) NSNumber *myNum; 
@end 

Mise en œuvre:

Cette propriété est pas un vrai exemple variable, de sorte que vous ne pouvez pas y accéder en utilisant la syntaxe du pointeur ->. Cependant, la syntaxe à points et la syntaxe à crochet sont disponibles.

+0

Nitrick mineur. Votre solution ne vous permet pas d'ajouter une variable d'instance. Il vous permet d'ajouter une propriété. – rmaddy

+0

@rmaddy C'est une observation juste, j'ai édité pour préciser que c'est une propriété, pas une vraie variable d'instance. Merci! – dasblinkenlight