2009-12-19 7 views

Répondre

4

Les variables d'instance privées sont utilisées pour séparer l'interface de l'implémentation. En Objective-C, puisque la déclaration de classe doit afficher toutes les variables d'instance, il doit y avoir un moyen d'empêcher les sous-classes d'accéder à celles qui font partie de l'implémentation interne. Sinon, d'autres programmeurs pourraient écrire du code qui dépend de ces variables internes, ce qui empêcherait le concepteur de classe d'apporter des modifications aux internes de la classe sans casser le code existant. D'un autre point de vue, les variables d'instance not marquées private font partie d'un contrat avec le programmeur de sous-classe, alors que celles qui sont marquées private ne le sont pas. Cela signifie que les variables d'instance doivent généralement être marquées private afin qu'elles ne soient accessibles que par leurs méthodes d'accès, voire pas du tout. Sinon, quelqu'un pourrait facilement écrire une sous-classe de votre classe, et créer simplement un accesseur pour rendre n'importe quelle variable d'instance publique.

+0

Merci pour votre réponse détaillée. En ce qui concerne l'écriture d'une sous-classe pour publiciser les variables d'instance, je suis assez sûr que '@ private' ne protège pas contre les catégories les publiant. Pensées? –

+1

J'ai essayé, et vous avez absolument raison. Il semble que les catégories aient accès à toutes les variables d'instance, y compris les variables privées. Je suppose que Objective-C vous donne encore assez de corde pour vous accrocher si vous voulez vraiment :) –

+1

Vous pouvez également utiliser les fonctions d'exécution pour attraper l'ivar. Mais si vous faites de telles choses, vous savez que c'est un hack sale, contrairement à innocemment dépendant d'un ivar superclasse que vous pensiez fiable. – Chuck

1

Si vous ne voulez pas que les sous-classes puissent accéder aux variables, marquez-les @private.

0

Une autre façon de le faire est de déclarer des variables d'instance dans la section @implementation. De telles variables sont implicitement privées. Source: Kochan: Programmation en Objective-C, quatrième édition. p. 199. Il n'est donc pas vrai que la déclaration de classe doit montrer toutes les variables d'instance, comme indiqué par e.James. La seule raison de déclarer des variables d'instance dans @interface est de permettre qu'elles soient héritées par une classe dérivée (sous-classe).

+0

La façon correcte de faire cela est de le déclarer dans une extension de classe dans le fichier .m. Ceci s'applique aux méthodes privées ainsi qu'aux ivars et aux propriétés. Une extension de classe ressemble à une catégorie non nommée '()', mais a des sémantiques et des capacités différentes. – ikuramedia