47 votes

Variables d'instance déclarées dans le fichier d'implémentation ObjC

Je regardais la WWDC ARC introduction de la vidéo et j'ai vu quelque chose que je n'ai jamais vu en ObjC avant lorsque certains Apple ingénieur parlé d'une Pile par exemple.

Le code suivant a été utilisé pour une pile de exemple avec de l'ARC:

@implementation Stack 
{ 
    // instance variable declared in implementation context
    NSMutableArray *_array; 
}

- (id)init 
{
   if (self = [super init])
      _array = [NSMutableArray array];
   return self;
}

- (void)push:(id)x 
{
   [_array addObject:x];
}

- (id)pop 
{
   id x = [_array lastObject];
   [_array removeLastObject];
   return x;
}

@end

Veuillez noter que la variable d'instance a déclaré juste après le @de mise en œuvre de la directive.

Maintenant, la chose qui m'a surpris, c'est qu'une variable d'instance pourrait en fait être déclarée dans le fichier d'implémentation, sans être une variable statique. Mes questions sont les suivantes:

  • Est-ce une nouvelle construction introduit dans le SDK pour iOS 5 ou cela a été possible pendant un certain temps?
  • Serait-il bon de les déclarer les variables d'instance dans la mise en œuvre, si les variables d'instance ne sont pas accessibles en dehors de l'objet? Il semble de façon plus propre, l'utilisation de l' @privé de la directive.

40voto

Seamus Campbell Points 11752

C'est en effet une nouvelle fonctionnalité, et si vous devez déclarer votre ivars (plutôt que de simplement déclarer des propriétés et de laisser le compilateur de générer ivars pour vous) c'est une bonne pratique. Vos fichiers d'en-tête, en théorie, ne devrait exposer interface publique pour vos classes; tout le reste appartient à la mise en œuvre.

Une mise en garde est que la mise en œuvre de fichier ivars ne sont pas visibles dans les sous-classes, qui peuvent parfois être un peu gênant si vous avez généré manuellement les setters et getters que vous avez besoin de sous-classe.

18voto

David Temple Points 161

Déclarant iVars à l'intérieur de la mise en œuvre est sans aucun doute une nouvelle construction en objective C. Vous devez être à l'aide de xcode4.2 et ont le compilateur LLVM sélectionné dans vos paramètres de construction. L'idée est de garder vos fichiers d'en-tête de nettoyage. Vous pouvez lister vos ivars à l'intérieur des accolades comme cet exemple;

@implementation MyClass {    
  int var1;
  int var2;
}

La réponse donnée par Rahul n'est pas vraiment correcte, bien que vous pouvez delare variables dans la façon dont il dit qu'ils seraient considérés comme statique par le compilateur. Sans doute pour le cas dans lequel il a utilisé eux, il n'a pas d'importance.

3voto

Leander Points 103

Je suis nouveau à l'Objective-C, et j'ai trouvé la pratique de déclarer ivars dans l'en-tête très très bizarre. Cela signifie déclarer l'état interne d'un objet dans son en-tête public, qui défie le concept d'encapsulation.

Par exemple, dire que vous possédez un IPad. Apple n'a pas envie de vous casser le IPad ouvrir et de les soulever , et de jouer avec les éléments à l'intérieur. Si ils veulent que vous modifiez quelque chose, l'IPad ont un réglage qui vous permettent de changer.

De même, je ne veux pas d'autres programmeurs pour voir la ivars de mes objets. Son état interne de mon objet. Si je veux vous faire accéder à l'état interne, je déclare les propriétés.

Donc, comme dans d'autres languaes, je voudrais cacher mon ivars à l'intérieur de la implementationfile, et de ne pas les déclarer dans le header.

Déclarant ivars dans l'en-tête me paraît très très bizarre. Ceux ivars de mise en œuvre spécifiques, et ne devraient tout simplement pas être une partie de l'en-tête de fichier.

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