Compilation d'une méthode sans nom...

Bonsoir,



Tout à  l'heure j'ai eu un plantage a l'exécution d'un code, lié à  l'altération du titre d'une méthode dans le fichier d'implémentation.

Normalement j'avais

- (void)deleteVendorList:(DGCDVendorList *)aVendorList

{ ...



et pour une raison quelconque (au départ j'ai soupçonner un problème avec Git, mais il faut que j'arrête d'être parano, j'imagine plutôt que j'ai du poser quelque chose sur mon clavier quand elle était sélectionnée?) j'ai eu ceci à  la place...





- (void)











:(DGCDVendorList *)aVendorList



ce qui est curieux c'est qu'il n'y a aucun warning lors de la compilation (même après un clean), du coup avant de le repérer dans le code j'ai cherché l'implémentation de cette méthode dans le projet sans la trouver, j'ai trouvé cela un peu étrange.



Ca vaut peut-être pas le coup d'en parler, mais au cas où cela pourrait économiser quelques cheveux...

Réponses

  • hum, j'imagine que c'est une méthode interne à  ta classe, que tu n'avais pas déclaré de prototype pour ta méthode (dans le .h)



    certainement que le compilateur n'interdit pas le caractère de retour à  la ligne dans le nom d'une méthode, d'où le manque de warning.



    quant à  l'obtention de ce genre de chose, oui, poser quelque chose sur la touche entrée, un ctrl+F puis entrée / entrée / entrée /etc. qui se passe mal, une suite d'entrée que l'on pense inactif alors qu'en fait le curseur n'est pas où on le croit, etc. En tout cas je ne vois pas pourquoi ce serait la faute de Git, le bug est très souvent entre la chaise et le clavier. Ceci n'est pas que valable pour les utilisateurs de logiciels, également pour les concepteurs image/wink.png' class='bbc_emoticon' alt=';)' />
  • AliGatorAliGator Membre, Modérateur
    janvier 2013 modifié #3
    Ca peut sembler curieux, mais en même temps, pas si déconnant de ne pas avoir eu de warning.



    En effet, pour rappel :
    • le nom d'une méthode Objective-C est composée de toutes ses portions, types et nom des variable-paramètres exclus, mais caractères ":" compris. Par exemple, la méthode qui a pour signature "-(void)setObject:(id)value forKey:(id<NSCopying>)key;", son est très exactement "setObject:forKey:". Il ne faut jamais oublier les ":" dans ce nom pour désigner la méthode (par exemple quand on construit un @selector à  partir du nom de la méthode, etc)
    • même si en pratique tout le monde met des préfixes avant les ":" pour introduire un peu le nom des paramètres qui vont suivre, en théorie d'après la définition du langage, rien ne t'oblige à  mettre qqch avant ces ":". Ainsi une méthode dont la signature serait écrite "-(void)setValue:(id) forKey:(id<NSCopying>)key" (note l'oubli de la part de l'auteur de mettre un nom au paramètre après "setValue:", erreur qui est arrivée au moins une fois à  la plupart d'entre nous) serait en fait interprétée comme "-(void)setValue:(id)forKey :(id<NSCopying>)key" et donc comme la méthode de nom "setValue::" dont le premier paramètre est référencé par une variable nommée "forKey" et le 2e paramètre référencé par une variable nommée "key"...


    Donc bien sûr en pratique on n'écrit jamais des méthodes dont les ":" ne sont pas précédés d'une portion de texte aidant à  comprendre le but du paramètre à  suivre... mais en réalité rien ne t'interdit d'écrire une méthode "-(void)toto:(id)arg1 :(id)arg2 :(id)arg3 :(id)arg4"... même si tu risques de te faire lyncher par ceux qui vont relire ton code car c'est vraiment une mauvaise idée pour la compréhension, techniquement le langage l'autorise.



    C'est pour ça qu'au final dans ton cas le compilateur n'a pas gueulé, puisque finalement pour lui tu as créé une méthode qui a simplement pour nom ":" tout court... et que c'est un nom de méthode valide !



    PS : La seule classe que je connais dans toute l'API Apple qui a des paramètres non nommés (sans préfixe avant les ":") c'est la classe CAMediaTimingFunction (et ses méthodes comme "+ (id)functionWithControlPoints:(float)c1x :(float)c1y :(float)c2x :(float)c2y" par exemple), je n'en ai jamais vu nulle part ailleurs (et tant mieux !)
  • denis_13denis_13 Membre
    février 2013 modifié #4
    merci pour vos réponses, en fait je n'ai pas été assez précis dans mon poste, j'avais bien un prototype dans le .h, ce qui m'a gêné c'est précisément de pas avoir vu de warning d'implémentation "incomplète". Ceci étant dit, maintenant tout semble rentré dans l'ordre (il y a eu entre deux l'installation des commande line tools, et un reboot, mais mais il est pas à  exclure que le warning ait échappé à  mon attention..., ca doit-être la psychose de la mise à  jour!)
  • AliGatorAliGator Membre, Modérateur
    Ah par contre oui si tu avais un prototype dans ton .h et que du coup tu n'avais pas l'implémentation dans ton .m (puisqu'avec ta fausse manip le nom de la méthode n'était plus bon), c'est en effet bizarre que tu n'aies pas eu le warning "Incomplete implementation"... T'es sûr que la méthode n'était pas implémentée aussi dans une classe parente ?
  • la méthode n'est pas implémentée ailleurs, mais en refaisant quelques tests il me met maintenant le warning, mais il faut dire qu'entre temps j'ai redémarré l'ordi et aussi il a installé les commande lines tools... je ne sais pas trop quoi dire.

    PS: Je me suis fait un resto avec des amis ce midi et ils m'ont recommandés une super applie... FoodReporter :-)
  • AliGatorAliGator Membre, Modérateur
    Arf c'est cool pour le resto et la recommandation de FR par tes amis, c'est le comble, j'adore image/smile.png' class='bbc_emoticon' alt=':)' />
Connectez-vous ou Inscrivez-vous pour répondre.