La réponse est... eh bien... simple. La simplicité et la cohérence, en fait.
Objective-C est purement dynamique au moment de la répartition de méthode. En particulier, chaque méthode de répartition passe par exactement la même dynamique de la méthode de résolution point que toute autre méthode d'expédition. Au moment de l'exécution, chaque méthode de la mise en œuvre a exactement la même exposition et toutes les Api fournies par l'Objective-C runtime qui travaillent avec des méthodes et des sélecteurs de travailler également la même dans toutes les méthodes.
Comme beaucoup l'ont déjà répondu (à la fois ici et dans d'autres questions), au moment de la compilation des méthodes privées sont pris en charge; si une classe n'est pas déclarer une méthode dans son publiquement disponibles de l'interface, alors que la méthode pourrait tout aussi bien ne pas exister autant que de votre code. En d'autres termes, vous pouvez obtenir toutes les différentes combinaisons de visibilité souhaitée au moment de la compilation par l'organisation de votre projet de façon appropriée.
Il y a peu d'avantages à en reproduisant les mêmes fonctionnalités dans runtime. Il serait ajouter une quantité énorme de complexité et de surcharge. Et même avec tout ce qui est de la complexité, il n'est pas de prévenir tous les, mais le plus décontracté des développeurs de l'exécution de votre soi-disant "privé".
EDIT: Une des hypothèses que j'ai
remarqué, c'est que les messages privés seraient
avoir à passer par le moteur d'exécution
entraînant potentiellement une large
les frais généraux. Est-ce vrai?
Oui, il est. Il n'y a aucune raison de supposer que le réalisateur d'une classe ne voulez pas utiliser la totalité de l'Objective-C ensemble de fonctions dans la mise en œuvre, et cela signifie que la distribution dynamique qui doit arriver. Cependant, il n'y a pas de raison particulière méthodes privées ne pouvait pas être distribué par une variante particulière de l' objc_msgSend()
, puisque le compilateur sait qu'ils ont été privés; c'est à dire ce qui pourrait être réalisé par l'ajout d'une seule méthode de la table à l' Class
de la structure.
Il n'y aurait aucun moyen pour un privé
méthode de court-circuit de cette case ou
passez de l'exécution?
Il ne pouvait pas ignorer l'exécution, mais l'exécution ne serait pas forcément à faire aucune vérification de méthodes privées.
Cela dit, il n'y a aucune raison pour qu'un tiers ne pouvait pas délibérément appel objc_msgSendPrivate()
sur un objet, en dehors de la mise en œuvre de cet objet, et certaines choses (KVO, par exemple) aurait à le faire. En effet, il s'agirait juste d'une convention et d'un peu meilleure dans la pratique que de préfixer les méthodes privées' sélecteurs, ou de ne pas les mentionner dans l'interface d'en-tête.
Pour ce faire, cependant, serait saper la pure nature dynamique de la langue. Il n'y aurait plus de chaque méthode de répartition passer par un identique d'expédition mécanisme. Au lieu de cela, vous devez rester dans une situation où la plupart des méthodes se comporte d'une façon et une petite poignée sont simplement différentes.
Cela s'étend au-delà de l'exécution comme il existe de nombreux mécanismes en Cacao construit sur le haut de la cohérence de la dynamisme de l'Objective-C. Par exemple, à la fois Valeur de la Clé de Codage et de la Valeur de la Clé de l'Observation devrait être très fortement modifiées à l'appui de méthodes privées, probablement par la création d'une faille exploitable ou privé méthodes seraient incompatibles.