51 votes

"Appeler une méthode" OU "envoyer un message" dans Objective C

En C ou dans tout langage basé sur ECMAscript, vous appelez une méthode ou une fonction publique sur un objet. Mais dans la documentation pour Objective C, il n'y a pas d'appels de méthodes publiques, mais uniquement l'envoi de messages.

Y a-t-il un problème en pensant que lorsque vous envoyez un message dans ObjC, vous appelez en fait une méthode publique sur un objet?

57voto

Dave DeLong Points 156978

Théoriquement, ils sont différents.

Pratiquement, pas tellement.

Ils sont différents en ce sens qu'en Objective-C, les objets peuvent choisir de ne pas répondre à des messages ou des messages sur les différents objets, ou quoi que ce soit. Dans des langages tels que le C, les appels de fonction sont vraiment juste de sauter à un certain endroit dans la mémoire et l'exécution du code. Il n'y a pas de comportement dynamique impliqués.

Cependant, dans la norme des cas d'utilisation, lorsque vous envoyez un message à un objet, la méthode que le message représenté généralement finissent par être appelé. Donc, environ 99% du temps, l'envoi d'un message de résultat de l'appel d'une méthode. En tant que tel, nous disons souvent "appeler une méthode" quand on veut dire vraiment "envoyer un message". Donc, pratiquement, ils sont presque toujours les mêmes, mais ils n'ont pas à être.

Il y a un moment, j'ai ciré philosophique sur ce sujet et blogué à ce sujet: http://davedelong.tumblr.com/post/58428190187/an-observation-on-objective-c

modifier

Pour répondre directement à votre question, il n'y a normalement rien de mal à dire "l'appel d'une méthode" au lieu de "envoyer un message". Cependant, il est important de comprendre qu'il est très important de mise en œuvre de la différence.

(Et en passant, ma préférence personnelle est-à-dire "appeler une méthode sur un objet")

20voto

shosti Points 4672

En raison de l'Objective-C dynamique de messagerie expédition, l'envoi d'un message est en fait différent de l'appel d'une fonction C ou C++ méthode (bien que finalement, une fonction C sera appelé). Les Messages sont envoyés via les sélecteurs pour la réception de l'objet, qui répond au message, en invoquant un IMP (C pointeur de fonction) ou en envoyant le message à sa super-classe. Si aucune classe dans l'héritage de la chaîne d'répond au message, une exception est levée. Il est également possible d'intercepter un message et de le transmettre à un tout autre classe (c'est ce qu' NSProxy sous-classes n').

Lors de l'utilisation d'Objective-C, il n'y a pas une énorme différence entre l'envoi d'un message et C++-style de l'appel de méthode, mais il y a quelques implications pratiques de la transmission de message système que je connais:

  1. Depuis le traitement du message arrive au moment de l'exécution, au lieu de la compilation, il n'y a pas de compilation moyen de savoir si une classe répond à aucun message particulier. C'est pourquoi vous obtenez généralement des avertissements du compilateur à la place d'erreurs lorsque vous avez mal orthographié un méthode, par exemple.
  2. Vous pouvez envoyer un message à nil, permettant aux idiomes comme [foo release] sans vous soucier de vérifier la valeur NULL.
  3. Comme @CrazyJugglerDrummer dit, de répartition de messages permet d'envoyer des messages à un grand nombre d'objets à la fois, sans se soucier de savoir s'ils vont y répondre. Cela permet informel de protocoles et d'envoyer des messages à tous les objets dans un conteneur.
  4. Je ne suis pas sûr à 100%, mais je pense que les catégories (ajout de méthodes déjà existantes classes) est possible grâce à des dynamiques message d'envoi.
  5. L'envoi d'un Message permet le transfert de messages (par exemple avec NSProxy sous-classes).
  6. Envoi de Message vous permet de faire des choses intéressantes à faible niveau de piratage tels que la méthode swizzling (échange d'implémentations de méthodes au moment de l'exécution).

4voto

Gordon Gustafson Points 14778

Non, il n'y a rien du tout de mal avec la penser comme ça. Ils sont appelés les messages, car ils sont d'une couche d'abstraction au-dessus de fonctions. Une partie de cela vient de l'Objectif C est de type system. Une meilleure compréhension des messages d'aide:

source complet sur wikipédia (j'ai choisi certaines des questions plus pertinentes)

Noms internes de la fonction sont rarement utilisé directement. Généralement, les messages sont convertis à la fonction appels définis dans l'Objective-C la bibliothèque d'exécution. Il n'est pas nécessairement connu au moment de la liaison de la méthode qui sera être appelé parce que la classe des récepteur (l'objet qui est envoyé à l' message) n'a pas besoin d'être connu jusqu' moment de l'exécution.

de même l'article:

L'Objective-C modèle de la programmation orientée objet est basé sur la transmission de messages à l'objet les instances. En Objective-C, on ne répond pas appeler une méthode; on envoie un message. L'objet de l' message s'adresse - le récepteur - n'est pas garanti pour répondre à une message, et si elle ne le fait pas, il a simplement lève une exception. Smalltalk-style de programmation permet aux messages d'aller a jamais été appliquée, avec la méthode de résoudre le mise en œuvre lors de l'exécution. Pour exemple, un message peut être envoyé à un collection d'objets, à laquelle seulement certains seront appelés à intervenir, sans crainte de la production d'exécution erreurs. (Le Cacao de la plate-forme cet avantage, comme tous les objets dans un Application Cocoa sont envoyés à l' awakeFromNib: message comme l'application se lance. Les objets peuvent répondre par l'exécution de toute initialisation nécessaire au lancement.) La transmission de Message aussi ne nécessite pas d' que l'objet défini lors de la compilation temps.

2voto

Jano Points 37593

Sur un C appel de fonction, le compilateur remplace le sélecteur avec un appel à une fonction et à l'exécution des sauts en réponse à l'appel de la fonction.

En Objective-C méthodes sont dynamiquement lié à des messages, ce qui signifie que les noms de méthode sont résolus à des implémentations à l'exécution. Plus précisément, l'objet est examiné lors de l'exécution pour voir si elle contient un pointeur vers une mise en œuvre pour le sélecteur.

En conséquence, Objective-C permet de charger et de lier de nouvelles classes et catégories alors qu'il est en cours d'exécution, et d'effectuer des techniques comme swizzling, catégories, objet de procurations, et d'autres. Rien de cela n'est possible en C.

-6voto

Puppy Points 90818

A été enseigné cela dans mon cours de Java. Je dirais qu'ils n'ont que des différences réalistes dans les scénarios multithread, où la transmission de messages est une technique très légitime et souvent utilisée.

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