125 votes

Objective-C : Propriété / variable d'instance dans la catégorie

Comme je ne peux pas créer une propriété synthétisée dans une catégorie en Objective-C, je ne sais pas comment optimiser le code suivant :

@interface MyClass (Variant)
@property (nonatomic, strong) NSString *test;
@end

@implementation MyClass (Variant)

@dynamic test;

- (NSString *)test {
    NSString *res;
    //do a lot of stuff
    return res;
}

@end

Le site méthode d'essai est appelé plusieurs fois lors de l'exécution et je fais beaucoup de choses pour calculer le résultat. Normalement, en utilisant une propriété synthétisée, je stocke la valeur dans un IVar _test la première fois que la méthode est appelée, et je retourne cet IVar la fois suivante. Comment puis-je optimiser le code ci-dessus ?

2 votes

Pourquoi ne pas faire ce que vous faites normalement, mais au lieu d'une catégorie, ajouter la propriété à une classe de base MyClass ? Et pour aller plus loin, effectuez vos tâches lourdes en arrière-plan et faites en sorte que le processus déclenche une notification ou appelle un gestionnaire pour MyClass lorsque le processus est terminé.

4 votes

MyClass est une classe générée à partir de Core Data. Si je mets mon code objet personnalisé dans la classe générée, il disparaîtra si je régénère la classe à partir de mes données de base. Pour cette raison, j'utilise une catégorie.

1 votes

Acceptez peut-être la question qui correspond le mieux au titre ("Propriété dans la catégorie").

-2voto

kernix Points 535

Une autre solution possible, peut-être plus simple, qui n'utilise pas de Associated Objects consiste à déclarer une variable dans le fichier d'implémentation de la catégorie comme suit :

@interface UIAlertView (UIAlertViewAdditions)

- (void)setObject:(id)anObject;
- (id)object;

@end

@implementation UIAlertView (UIAlertViewAdditions)

id _object = nil;

- (id)object
{
    return _object;
}

- (void)setObject:(id)anObject
{
    _object = anObject;
}
@end

L'inconvénient de ce type d'implémentation est que l'objet ne fonctionne pas comme une variable d'instance, mais plutôt comme une variable de classe. En outre, les attributs de propriété ne peuvent pas être assignés (comme ceux utilisés dans les objets associés tels que OBJC_ASSOCIATION_RETAIN_NONATOMIC).

0 votes

La question porte sur la variable d'instance. Votre solution est tout comme Lorean

1 votes

Vraiment ? Savez-vous ce que vous faites ? Vous avez créé une paire de méthode getter/setter pour accéder à une variable interne qui est indépendante pour un fichier MAIS un objet de classe, c'est-à-dire, si vous allouez deux objets de classe UIAlertView, les valeurs de leurs objets sont les mêmes !

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