7 votes

Pourquoi ne puis-je pas @synthétiser les accesseurs dans une catégorie ?

Obj-C 2.0 me permet de déclarer des propriétés dans une catégorie, mais le compilateur refuse de synthétiser des accesseurs à l'intérieur de la catégorie. Pourquoi ?

(Il est parfois judicieux, du point de vue de l'organisation, de placer un ensemble d'éléments connexes dans une catégorie, même si les iVars de soutien sont placées dans la déclaration de la classe. Je connais les extensions de classe et les propriétés privées, mais ce n'est pas mon cas d'utilisation).

9voto

Jim Dovey Points 8384

Le problème est que les catégories sont logiquement séparées de leurs classes et sont même stockées séparément dans le fichier binaire. L'implémentation interne est qu'une structure de description de classe contient un tableau de listes de méthodes qui, au départ, ne contient que la liste des méthodes définies dans la catégorie principale @implementation bloc. Au fur et à mesure que les modules de liaison ObjC chargent de nouvelles catégories, leurs listes de méthodes sont ajoutées à ce tableau.

En raison de cette implémentation, les catégories elles-mêmes n'ont aucun moyen d'accéder au stockage d'une classe et ne peuvent donc pas la modifier (cela soulève également la question de savoir ce qu'il faut faire lorsque la catégorie est déchargée).

Enfin, d'un point de vue plus logique que technique, l'idée est qu'une catégorie ne possède pas la structure en mémoire d'une classe, elle y associe simplement de nouvelles méthodes. Pour prendre pleinement en charge la synthèse des propriétés, elle devrait modifier le stockage de la classe d'une manière ou d'une autre

La solution ? Soit vous placez les instructions @synthesize dans votre bloc principal @implementation, soit vous implémentez vos propres accesseurs directement dans la catégorie @implementation.

0voto

La question posée ici couvre le problème de l'accès privé. Le présent document aborde la question d'un point de vue autre que celui de l'accès privé.

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