Les variables d'Instance a déclaré dans ObjC mise en œuvre de fichier

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 exemple.

Le code suivant a été utilisé pour une pile exemple avec 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 la @mise en œuvre 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ée directive.
  • Avez-vous un complet, compilable exemple?
  • Le code ci-dessus devrait compiler correctement avec l'iOS 5 SDK.
  • Plutôt que d'ajouter le iVars dans une extension de classe?
  • En essayant de déclarer ivars dans une extension donne une erreur dans la version actuelle de Xcode avec Clang: "les variables d'Instance ne peut pas être placé dans la catégorie de l'extension". Était-ce déjà autorisé?
  • Mmm ça me permet de le faire sur iOS êtes-vous à l'aide de Mac OS?
  • Oui, sur Mac OS.
  • Je l'ai regardé en ligne, il semble que cela ne fonctionne que sur iOS pour une raison étrange.
  • Intéressant, bon à savoir. Me demande pourquoi.