2010-05-24 11 views
1

Je viens de commencer à développer pour l'iPhone et je suis en train d'apprendre Objective-C. J'ai vu un code qui implémente une méthode dans le côté @implementation d'une classe comme ceci:Nuances d'implémentation de la méthode Objective-C

-(void)myMethod; { 
    // method body 
} 

Ce qui rend ce intéressant est qu'il n'y a aucune mention de myMethod dans le @interface pour la classe. J'ai essayé un exemple de projet avec ceci et quand je compile je reçois un avertissement de XCode que myMethod peut ne pas être vu par le code appelant.

Quelqu'un peut-il me dire ce qui se passe?

Merci!

Répondre

0

En ObjC, les appels de méthode sont résolus dynamiquement (dynamic binding), ce qui signifie que lorsque vous faites [obj myMethod];, en interne le logiciel d'exécution ObjC passera par les méthodes de la classe à ce moment et si elle trouve un appelé « myMethod » il l'appellera alors.

Il est également possible d'ajouter des méthodes à un objet lors de l'exécution.

Les déclarations de méthode dans une section @interface sont uniquement là pour aider le compilateur à déterminer quelles méthodes sont disponibles publiquement pour une classe donnée. Si vous ajoutez une méthode dans votre @implementation uniquement, le compilateur peut vous avertir à ce sujet, mais le code continuera de se compiler et de fonctionner.

J'utilise parfois ceci pour ajouter des méthodes internes à mes objets, qui sont seulement appelés d'après d'autres méthodes, et jamais de l'extérieur. Bien que je ne me souviens pas de voir les avertissements à ce sujet ... Assurez-vous que le code appelant est placé après l'implémentation de la méthode dans le même fichier.

+0

Il peut s'agir du point-virgule après le nom de la méthode à l'origine de l'avertissement. Lorsque j'écris des classes de test unitaires, je omets toujours la déclaration dans l'interface @ et je ne vois jamais de tels avertissements. – JeremyP

+0

@JeremyP Non, le point-virgule est légal. En fait, il est assez simple de ne pas avoir à éditer les en-têtes de méthode lorsque vous copiez-collez les depuis '@ interface' et retour. – hamstergene

2

Il est comme fonctions en C. Vous n'avez pas besoin d'une déclaration (à-dire qu'il ne doit pas être dans le @interface) mais s'il n'y a pas de déclaration, tout code avant la définition de la méthode génère cet avertissement. Le code après la définition de la méthode ne générera pas d'avertissement.