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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top