web-dev-qa-db-fra.com

Quelle est la différence entre une méthode et un sélecteur?

Quelle différence entre une méthode, un sélecteur et un message en Objective-C?

78
redconservatory

C'est une excellente question.

  • Sélecteur - un Sélecteur est le nom d'une méthode. Vous connaissez très bien ces sélecteurs: alloc, init, release, dictionaryWithObjectsAndKeys:, setObject:forKey:, Etc. Notez que les deux points fait partie du sélecteur; c'est ainsi que nous identifions que cette méthode nécessite des paramètres. De plus (bien que cela soit extrêmement rare), vous pouvez avoir des sélecteurs comme celui-ci: doFoo:::. Il s'agit d'une méthode qui prend trois paramètres, et vous l'appeleriez comme [someObject doFoo:arg1 :arg2 :arg3]. Il n'est pas nécessaire qu'il y ait des lettres avant chaque partie des composants du sélecteur. Comme je l'ai dit, c'est extrêmement rare, et vous ne le trouverez pas utilisé dans les frameworks Cocoa. Vous pouvez travailler avec des sélecteurs directement dans Cocoa. Ils ont le type SEL: SEL aSelector = @selector(doSomething:) ou SEL aSelector = NSSelectorFromString(@"doSomething:");

  • Message - un message est un sélecteur et les arguments que vous envoyez avec lui. Si je dis [dictionary setObject:obj forKey:key], Le "message" est le sélecteur setObject:forKey: Plus les arguments obj et key. Les messages peuvent être encapsulés dans un objet NSInvocation pour un appel ultérieur. Les messages sont envoyés à un récepteur . (c'est-à-dire l'objet qui "reçoit" le message).

  • Méthode - une méthode est une combinaison d'un sélecteur et d'une implémentation (et des métadonnées qui l'accompagnent). L '"implémentation" est le bloc de code réel; c'est un pointeur de fonction (un IMP). Une méthode réelle peut être récupérée en interne à l'aide d'une structure Method (récupérable depuis le runtime).


Quelques autres choses liées que vous n'avez pas demandées:

  • Signature de méthode - une signature de méthode représente les types de données retournés par et acceptés par une méthode. Ils peuvent être représentés au moment de l'exécution via un NSMethodSignature et (dans certains cas) un char* Brut.

  • Implémentation - le code exécutable réel d'une méthode. Son type à l'exécution est un IMP, et c'est vraiment juste un pointeur de fonction. iOS 4.3 inclut une nouvelle possibilité de transformer un bloc en IMP. C'est vraiment cool .

L'une des choses amusantes à réaliser est que le nom d'une méthode (le sélecteur) est distinct de l'implémentation de la méthode (l'IMP). Cela signifie que vous pouvez les échanger si vous vous sentez audacieux. Vous pouvez également ajouter et supprimer des méthodes lors de l'exécution, car tout ce que vous faites est de modifier une entrée dans une table de hachage: la clé est le sélecteur et la valeur est le IMP de la méthode. Cela vous permet de faire des trucs vraiment fous et trippants. Ce n'est pas pour les faibles de cœur. :)

139
Dave DeLong

Une méthode est l'implémentation qui est exécutée lorsqu'un objet ou une classe est invité à effectuer une action. Il est dans le cadre de sa classe conteneur et est donc différent lorsqu'il est référencé par une autre classe. Un sélecteur est un identifiant qui représente le nom d'une méthode. Elle n'est liée à aucune classe ou méthode spécifique et peut être utilisée pour décrire une méthode de n'importe quelle classe, qu'il s'agisse d'une méthode de classe ou d'instance.

Simplement, un sélecteur est comme une clé dans un dictionnaire. Il peut vous dire de quelle méthode quelqu'un parle, mais seulement si vous avez également le dictionnaire lui-même (la classe ou l'objet). La méthode est ce que vous obtenez lorsque vous demandez la valeur du dictionnaire en utilisant le sélecteur comme clé.

9
ughoavgfhw

Ce site a un bon aperçu de toute la terminologie en question: http://www.otierney.net/objective-c.html

Consultez le lien, mais je vais donner un bref résumé:

Une méthode est essentiellement comme une méthode de fonction à laquelle vous êtes habitué dans votre langage de programmation préféré.

Un message (extrait de l'article) "Un message peut être transmis dynamiquement à un autre objet. L'appel d'un message sur un objet dans Objective-C ne signifie pas que l'objet implémente ce message, mais simplement qu'il sait comment y répondre d'une manière ou d'une autre via l'implémenter directement ou transmettre le message à un objet qui sait le faire. "

Les sélecteurs peuvent signifier deux choses. Il peut faire référence au nom d'une méthode ou "fait référence à l'identifiant unique qui remplace le nom lorsque le code source est compilé. Les sélecteurs compilés sont de type SEL". (à partir de: http://developer.Apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocSelectors.html )

1
nstehr