Objective-C: comment prévenir les fuites d'abstraction
-
23-09-2019 - |
Question
Je crois que Objective-C, je dois déclarer des variables d'instance dans le cadre de l'interface de ma classe, même si ces variables sont des détails de mise en œuvre et ont un accès privé.
Dans « subjective » C, je peux déclarer une variable dans mon fichier .c et ce n'est pas visible à l'extérieur de cette unité de compilation. Je peux déclarer dans le fichier .h correspondant, puis tous ceux qui relie dans cette unité de compilation peut voir la variable.
Je me demande s'il y a un choix équivalent en Objective-C, ou si je dois en effet déclarer tous les Ivar dans le .h pour ma classe.
Ari.
La solution
Ari,
Une bonne référence à la façon d'accomplir exemple "invisibles" des déclarations de variables peuvent se trouve ici avec crédit respectueusement donné à Matt Gallagher.
it helps, Frank
Autres conseils
Les variables d'instance ont toujours été nécessaires pour déterminer la taille de la classe. Il a toujours été mauvaise pratique pour accéder directement aux Ivars, et qui ne sont pas le point. Dans l'exécution moderne, cela est moins nécessaire, mais en tout cas, ce n'est pas une fuite d'abstraction à moins que les clients comptent sur les Ivars, qui devrait être impossible, puisque vous êtes les déclarant comme @protected
ou @private
de la classe, non?
Pour restreindre l'accès, vous pouvez utiliser les mots-clés @private
ou @protected
:
@interface Foo : NSObject {
@private
int barPrivate;
@protected
int barProtected;
@public
int barPublic;
}
@end
EDIT:. tout Scratch, se révèle-je vraiment besoin de dormir
Ivars sont @protected
par défaut (bien que @private
et @protected
ne garantissent pas que les autres classes ne peuvent pas y accéder - vous pouvez toujours accéder à Ivars avec getValue:forKey:
). Vous ne devriez jamais accéder directement à Ivars d'autres classes directement dans tous les cas - le « choix » est de savoir si ou de ne pas exposer les Ivars que les propriétés (il vous suffit de compter sur toutes les classes suivantes de la convention pour ne pas accéder directement Ivars).
Dans la nouvelle exécution objective-c, vous ne devez pas déclarer Ivars du tout, car ils peuvent être synthétisés lors de l'exécution, mais malheureusement cela ne fonctionne pas avec le simulateur iPhone, donc pour l'instant, il est préférable juste déclarer tous les Ivars dans le fichier .h.