unrecognized selector sent to instance...

2»

Réponses

  • psychoh13psychoh13 Mothership Developer Membre
    08:39 modifié #32
    Je ne vois aucune fonction dans le runtime qui pourrait supprimer une méthode d'une classe.

    Tu peux "supprimer" l'implémentation d'une méthode mais tu peux pas supprimer l'objet Method lui-même de la class... C'est très bizarre... Il faudrait savoir à  quel moment ce changement est opéré, soit c'est un gros bogue du runtime, soit je reviens à  mon autre idée de créer un autre projet... ça n'a pas l'air en rapport mais pourtant ça marche bien des fois... Sur des bogues totalement sans rapport ou inexpliqués...
  • Philippe49Philippe49 Membre
    08:39 modifié #33
    Ou alors un effet de bord.
    Tu manipules tes données avec des classes Obj-C ou avec des types C ?
    Tu utilises une librairie ?
  • pinuspinus Membre
    08:39 modifié #34
    dans 1230982044:

    Ou alors un effet de bord.
    Tu manipules tes données avec des classes Obj-C ou avec des types C ?


    à  partir de mon singleton, c'est en C oui...


    Tu utilises une librairie ?


    Oui.. une simple librairie C. ça peut jouer ?

    Merci.

    Pinus
  • pinuspinus Membre
    08:39 modifié #35
    dans 1230981821:

    Je ne vois aucune fonction dans le runtime qui pourrait supprimer une méthode d'une classe.

    Tu peux "supprimer" l'implémentation d'une méthode mais tu peux pas supprimer l'objet Method lui-même de la class... C'est très bizarre... Il faudrait savoir à  quel moment ce changement est opéré, soit c'est un gros bogue du runtime, soit je reviens à  mon autre idée de créer un autre projet... ça n'a pas l'air en rapport mais pourtant ça marche bien des fois... Sur des bogues totalement sans rapport ou inexpliqués...


    Tout se passe comme si la 1ere exécution de cette méthode provoquait la disparition de celle-ci ;-) Je suis trop novice pour piger ce qui se passe, mais c'est assez impressionnant: tout se passe très bien lors de la première exécution. Après, il semble que mon instance ne propose plus cette méthode: tout simplement...

    Pinus.
  • psychoh13psychoh13 Mothership Developer Membre
    08:39 modifié #36
    Juste pour voir où la méthode disparaà®t...
    Mets ce log :
    NSLog(@"%p", class_getInstanceMethod([myObject class], @selector(myMethod)));
    

    Dans ta méthode et après le message problématique...
  • pinuspinus Membre
    08:39 modifié #37
    dans 1230982790:

    Juste pour voir où la méthode disparaà®t...
    Mets ce log :
    NSLog(@"%p", class_getInstanceMethod([myObject class], @selector(myMethod)));
    

    Dans ta méthode et après le message problématique...


    Justement ! c'est ce que je viens de faire :

    J'ai placé 2 NSLog, 1 au début de la méthode "-(BOOL)GetColumnListForTable:(NSString *)tableName", et 1 à  sa fin (juste avant de retourner le BOOL :

    2009-01-03 12:39:27.451 REAL Client[7971:813] 1) Instance Method : 0x16bfd0
    2009-01-03 12:39:27.452 REAL Client[7971:813] executing query : PRAGMA table_info(personnes)
    2009-01-03 12:39:27.514 REAL Client[7971:813] getting 124 rows
    2009-01-03 12:39:27.515 REAL Client[7971:813] 2) Instance Method : 0x0

    Donc, au moins, je sais ou ça déconne. Me reste plus qu'à  essayer des trucs.

    En tout cas, merci bien de m'avoir indiqué "class_getInstanceMethod", car c'est super efficace...

    Pinus

    donc je dois merdoyer

  • Philippe49Philippe49 Membre
    janvier 2009 modifié #38
    • Lance le projet ci-joint en mode debug, en mettant un breakpoint sur la ligne str=memset(....
    • En passant la souris tu récupères l'adresse de str
    • Fait un clic-droit dans la fenêtre du debugger, et observe la mémoire (suffisamment d'octets)
    • Au-delà  de str il y a des octets, peut-être sont-ils utilisés à  autre chose : une méthode, une référence, une autre variable
    • fait step into, continue et clique sur le bouton

    Tu vois le bug en temps réel
  • pinuspinus Membre
    08:39 modifié #39
    dans 1230983119:

    • Lance le projet ci-joint en mode debug, en mettant un breakpoint sur la ligne str=memset(....
    • En passant la souris tu récupères l'adresse de str
    • Fait un clic-droit dans la fenêtre du debugger, et observe la mémoire (suffisamment d'octets)
    • Au-delà  de str il y a des octets, peut-être sont-ils utilisés à  autre chose : une méthode, une référence, une autre variable
    • fait step into, continue et clique sur le bouton

    Tu vois le bug en temps réel


    J'essaie ça tout de suite merci.

    Mais on avance !

    ... j'ai placé ce NSLog après chaque ligne exécutée dans cette méthode, et le coupable est (j'ai honte) :

    un strcpy ...

    Je souçonne qu'il se prend les pieds dans le tapis en allant taper dans une zone mémoire allouée. Enfin, en bref, je sens bien le coup que tout ça vienne de ma méconnaissance des fonctions C sur les string. Je vais essayer de mieux gérer mes malloc car je sens que c'est de là  que vient l'embrouille.

    Pinus.
  • psychoh13psychoh13 Mothership Developer Membre
    08:39 modifié #40
    Bon... Fais voir ton appel strcpy()... Et surtout montre-nous où tu alloues/modifies les paramètres que tu passes à  cette fonction...
  • pinuspinus Membre
    08:39 modifié #41
    dans 1230983819:

    Bon... Fais voir ton appel strcpy()... Et surtout montre-nous où tu alloues/modifies les paramètres que tu passes à  cette fonction...


    ça y est, c'est trouvé: honte à  moi :

    Je manipulais tellement de chaà®nes C que je me suis pris les pieds dans le tapis, en faisant un malloc sur le mauvais pointeur, si bien que celui que j'utilisais dans strcpy n'avait pas de mémoire allouée, donc la pioche à  mémoire s'est servie, et le reste a déboulé en cascade...

    Une vraie honte pour moi. Mais je suis très impressionné de voir les conséquences que cela a pu avoir (disparition d'une méthode d'instance).

    Cela va sans dire que votre aide (et votre acharnement a m'aider) m'a été précieuse. Pas tant dans la connerie à  l'origine du problème que dans toutes les choses que j'ai pu apprendre au cours de ce pistage.

    Merci à  tous. Et là , le coup du malloc sur le mauvais pointeur, promis, il va rester gravé !!! Comme l'utilité de la fonction "class_getInstanceMethod" ;-)

    Pinus.

  • psychoh13psychoh13 Mothership Developer Membre
    08:39 modifié #42
    Le plus impressionnant selon moi c'est le fait que tu tombes à  chaque fois sur le même résultat...

    Et sans vouloir être méchant, mais pour quand même en remettre une couche... :) Je soupçonne qu'une mauvaise hygiène de vie concernant le respect des conventions t'as mené à  ce genre de résultat...  ;D
  • Philippe49Philippe49 Membre
    08:39 modifié #43
    dans 1230985206:

    Je manipulais tellement de chaà®nes C que je me suis pris les pieds dans le tapis, en faisant un malloc sur le mauvais pointeur, si bien que celui que j'utilisais dans strcpy n'avait pas de mémoire allouée, donc la pioche à  mémoire s'est servie, et le reste a déboulé en cascade...


    Ce sont des erreurs difficiles à  localiser, car le C étant (très) permissif, l'exécution ne s'arrête pas forcément à  l'endroit où il y a erreur.
    Pour compléter les bonnes recommandations de Psychoh, j'ajouterais qu'une avance dans un projet en emboà®tant des sous-projets successifs (ou en partitionnant) peut permettre de voir les erreurs à  temps . Par exemple, ici faire un sous-projet testant  le bon fonctionnement de la lecture de la BDD, en cherchant à  le pousser dans ses derniers retranchements, puis un autre sur le bon fonctionnement du singleton, puis l'interface ....
    Amen  <3
  • pinuspinus Membre
    08:39 modifié #44
    dans 1230985484:

    Le plus impressionnant selon moi c'est le fait que tu tombes à  chaque fois sur le même résultat...

    Et sans vouloir être méchant, mais pour quand même en remettre une couche... :) Je soupçonne qu'une mauvaise hygiène de vie concernant le respect des conventions t'as mené à  ce genre de résultat...  ;D


    Oui, en l'occurrence c'est un "malloc" sur le mauvais pointeur. Si ma mémoire est bonne, il s'est agit d'un d'un copier/coller ... Pour ce qui est des conventions, je vais relire le bouquin de Kochan pour bien les imprimer. Merci encore.

    Pinus.
  • pinuspinus Membre
    08:39 modifié #45
    dans 1230989309:

    dans 1230985206:

    Je manipulais tellement de chaà®nes C que je me suis pris les pieds dans le tapis, en faisant un malloc sur le mauvais pointeur, si bien que celui que j'utilisais dans strcpy n'avait pas de mémoire allouée, donc la pioche à  mémoire s'est servie, et le reste a déboulé en cascade...


    Ce sont des erreurs difficiles à  localiser, car le C étant (très) permissif, l'exécution ne s'arrête pas forcément à  l'endroit où il y a erreur.
    Pour compléter les bonnes recommandations de Psychoh, j'ajouterais qu'une avance dans un projet en emboà®tant des sous-projets successifs (ou en partitionnant) peut permettre de voir les erreurs à  temps . Par exemple, ici faire un sous-projet testant  le bon fonctionnement de la lecture de la BDD, en cherchant à  le pousser dans ses derniers retranchements, puis un autre sur le bon fonctionnement du singleton, puis l'interface ....
    Amen    <3 <br />


    En effet. Le projet en question n'est pas un projet de "production", mais juste un projet pour apprendre à  développer avec ObjC et Cocoa.. Pour ne voir que le bon coté des choses: j'ai beaucoup appris (grace à  vous, il est vrai). Encore merci.

    Pinus.
Connectez-vous ou Inscrivez-vous pour répondre.