2012-12-04 1 views
1

Je voudrais d'abord que en fait, nous « pouvons »Pourquoi nous ne pouvons pas ajouter iVar dans les catégories?

utiliser seulement des objets associés:

@implementation UIButton (BGButtonWithImages) 

static char UIB_ImageOfButton; 

-(void)setImageObject:(Image *)imageObject 
{ 
    objc_setAssociatedObject(self, &UIB_ImageOfButton, imageObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

-(Image*)imageObject 
{ 
    return (Image*)objc_getAssociatedObject(self, &UIB_ImageOfButton); 
}  
@end 

Mais cela conduit à une autre question. Pourquoi est-ce que quelque chose qui peut être fait facilement avec les objets associés ne peut pas être fait régulièrement? Pourquoi Apple n'implémente-t-il pas les propriétés dans des catégories comme celle-ci?

Répondre

4

Les accesseurs de propriété synthétisés utilisent des variables d'instance. Vous n'êtes pas autorisé à ajouter des variables d'instance via des catégories car il n'y aurait aucune garantie d'unicité - les mêmes variables d'instance peuvent être ajoutées par une autre catégorie.

Comme vous le constatez, le inside-out object pattern vous permet de définir des accesseurs dans des catégories, tant que votre clé pour la table objet associée est unique. C'est bien de continuer à l'utiliser. Si vous voulez une prise en charge de compilateur propriétaire pour générer ces accesseurs, vous devez ask Apple.

+0

Donc, si vous voulez une propriété dans les catégories, vous devez simplement mettre en œuvre des choses vous-même? Hmm ... Apple aurait pu rendre cela automatique. –

+0

Si les mêmes variables d'instance peuvent être ajoutées par une autre catégorie, cela peut être résolu au moment de la compilation, n'est-ce pas? –

+1

@SharenEayrs non, il ne peut pas. Bien que la fonctionnalité ne soit pas ouverte aux développeurs iOS, les catégories peuvent être chargées dynamiquement au moment de l'exécution. Vous ne savez pas, lors de la compilation d'une catégorie, quelles autres catégories existeront. Cela entraîne déjà un autre problème: vous ne pouvez pas remplacer de façon déterministe la méthode d'une classe dans une catégorie, car elle peut également être remplacée dans une autre catégorie. –

0

Je serais heureux de recourir à la technique présentée, mais ma situation est un peu inconfortable.

Mon objet principal est un objet CoreData Entity généré automatiquement. Je n'aime donc pas ajouter la variable d'instance (toute régénération de l'objet entité la supprimera).

Mes catégories sont écrites dans une autre source, pour étendre les objets d'entité (avec toutes sortes de propriétés calculées, dépendances de propriété, etc.).

Maintenant, une de mes propriétés readonly dans la catégorie doit "laisser une trace" et stocker une valeur dans une autre propriété de catégorie. Pour cela, il faut stocker la valeur quelque part! J'ai besoin d'une variable d'instance!

Que faire? Je me demande.

Questions connexes