J'ai remarqué que beaucoup d'interfaces Apple utilisent @private
avant leurs déclarations de variable d'instance. Y at-il une bonne raison de conception pour cela, et est-ce quelque chose que je devrais faire?Marquage des variables d'instance @private
Répondre
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.
Si vous ne voulez pas que les sous-classes puissent accéder aux variables, marquez-les @private.
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).
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
- 1. VS 2010 Private Private Extension
- 2. Marquage des boutons UIAlertView
- 3. private Méthodes accessibles
- 4. Marquage d'un objet comportant des zones d'objet
- 5. Marquage des paramètres comme Nullable
- 6. SVN Private File
- 7. mySQL private/conn questions
- 8. C#: implémentation d'IComparable private
- 9. windbg: symboles private pdb
- 10. Le marquage doit-il avoir des hiérarchies?
- 11. Marquage des paramètres doubles avec P/Invoke
- 12. Marquage des éléments modifiés dans DataServiceCollection (OData)
- 13. svn branchement et marquage des bonnes pratiques
- 14. NHibernate - Mappage du marquage des entités
- 15. zend framework 2 underscore private
- 16. iOS Private Documentation sur l'API
- 17. implication de private dans C
- 18. Dans quelles circonstances les variables d'instance sont-elles déclarées comme '_var' dans 'use fields' private?
- 19. Optimize « marquage » regex
- 20. Solution de marquage Rails
- 21. variables des variables Jquery
- 22. Marquage transparent jQuery?
- 23. Puis-je définir des champs "method-private" dans Scala?
- 24. Marquage CALayers dans l'iPhone
- 25. Onglets de marquage UITabBarController?
- 26. Marquage avec Zend Framework
- 27. Marquage d'un repo git?
- 28. marquage POS en allemand
- 29. Classe de membre statique - déclarez la classe private et le membre de classe package-private?
- 30. C++ portée des variables
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? –
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 :) –
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