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?
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. –
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? –
@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. –