Question sur les NSString

paozpaoz Membre
juin 2014 modifié dans Objective-C, Swift, C, C++ #1

Bonjour à  tous,


 


Je suis nouveau sur le forum (je me présenterais plus tard), et je suis un nouveau développeur en Objective-C.  Je connais beaucoup de langages et là  puisque j'apprends à  développer en Objective-C, j'ai été confronté à  un soucis bizarre que je voudrais comprendre et vous faire partager.

J'ai déjà  contourné le problème, mais je pense que j'ai du louper une étape soit dans la gestion mémoire (je n'ai pas fait de C++ depuis des lustres) soit quelque chose en Obj-C.


 


Je m'explique, j'ai créé une TableViewController que j'ai rempli.


J'ai créé un ProductViewController (.h et .m) qui hérite de UITableViewController.


J'ai créé aussi un modèle Product.m et Product.h pour mon modèle de données.


 


Dans mon Product.h j'ai déclaré (et défini dans mon .m) le constructeur suivant :



- (id) initWithString : (NSString *) product_name product_rate: (float) product_rate;

Je suis confronté au problème suivant : Quand dans mon délegate je crée un objet Product en l'instanciant comme défini plus haut, aucun problème :



Product *p1 = [[Product alloc] initWithString: @test product_rate: 1];


 


Par contre, si je modifie la ligne du dessus par :



- (id) initWithString : (float) product_rate product_name:(NSString *) product_name;

(Le nom du constructeur n'est pas bon mais on s'en fou pour l'exemple)


Et que je modifie l'instanciation par :



Product *p1 = [[Product alloc] initWithString: 1 product_name: @test];

Alors ca plante lorsque je lance le simulateur.


 


Comment cela se fesse ?!


C'est juste incompréhensible pour moi, donc je me tourne vers vous, développeurs avec plus de bagages dans ce langage!


 


Merci d'avance pour vos idées (ou bonnes réponses)!


Mots clés:

Réponses

  • Bon OK pour la présentation différée !!! Mais...  >:(


     


    Peux tu utiliser les balises code pour donner des lignes de code, car sinon c'est assez pénible à  lire !


     


    Ensuite, de ce que j'arrive à  lire, il te manque un ":" :



    - (id) initWithString : (float) product_rate product_name (NSString *) product_name;


     



     


    Sinon, ce serait mieux que tu montres le message d'erreur, ce serait plus clair, mon super espion qui regarde ton écran par dessus ton épaule est en vacances, il revient la semaine prochaine !!


  • Alf1996Alf1996 Membre
    juin 2014 modifié #3

    En plus,



    initWithString:(float)...

    C'est vraiment pas top ! Regarde bien ce que tu écrit ! C'est un peu comme si tu disais, j'achète un vélo Airbus A380...


  • paozpaoz Membre
    juin 2014 modifié #4

    Salut Alf,


     


    J'ai mis à  jour mon post comme tu l'as précaunisé.


    Il n'y a pas d'erreur de syntaxe, j'ai corrigé sur mon post.


     


    Le problème c'est que quand j'inverse et que je mets le string en dernier, ca plante. Et sans être vulgaire, je me disais W*F devant l'écran tellement c'est pas logique à  mon sens.


     


    Pour le code erreur, il disait simplement qu'il y avait un soucis au niveau de l'instanciation : signal Sigabrt, et il montrait la ligne de code  :



    Product *p1 = [[Product alloc] initWithString: 1 product_name: @test];

    On est d'accords que c'est incompréhensible ?


     


    EDIT : J'ai bien dit : (Le nom du constructeur n'est pas bon mais on s'en fou pour l'exemple)


  • colas_colas_ Membre
    juin 2014 modifié #5

    As-tu bien créé deux méthodes init ?


     


    Une : 



    - (id) initWithRate:(float)product_rate product_name:(NSString *) product_name;

    en plus de celle déjà  existante



    - (id)initWithString:(NSString *) product_name product_rate:(float)product_rate


    ?


  • Sinon, on n'écrit pas 



    - (id)initWithString:(NSString *) product_name product_rate:(float)product_rate

    en objective-C mais



    - (id)initWithString:(NSString *)productName productRate:(float)productRate
  • paozpaoz Membre

    Salut Colas2,


     


    Exactement !


    La première plantait, et la seconde non.


    Juste incompréhensible.


     


    Merci pour la précision sur les normes de codages.


     


    __


     


    J'ai une question HS (je ne vais pas polluer le forum avec un autre thread) :


    Dans tous les tutos que j'ai lu (et ça en fait un paquet), la plupart font tout dans le AppDelegate.m et les instanciations dans la méthode didFinishLaunchingWithOptions.


     


    Pour un gros programme, c'est comme si on faisait tout dans la méthode main (en langage C). C'est immonde.


    Normalement en MVC on balance tout dans le controller en question.


    Donc ma question c'est : dans vos programmes, la méthode didFinishLaunchingWithOptions est quasiment vide ou pas ?


    A quoi vous sert réellement le AppDelegate ?


  • @paoz tu as raison. Tu pourrais ouvrir un nouveau thread. C'est un sujet classique et intéressant.


  • paozpaoz Membre

    Avec plaisir, je m'exécute :)


  • AliGatorAliGator Membre, Modérateur
    Fais un clean de ton code avant de relancer. Car là  si tu n'as pas changé le nom de ta méthode (qui s'appelle toujours "initWithString:..." sauf que cette fois elle prend un float) peut-être qu'il y a des restes de l'ancienne implémentation et ancienne API quand tu re-run l'appli parce qu'il n'a pas vu de changement.

    Aussi et surtout, es-tu sûr d'avoir changé tout ce qu'il faut dans ta chaà®ne de ton API quand tu es passé d'une NSString à  un float ?
    Par exemple dans l'implémentation de ta version "initWithString:(float)..." qui prend un float en premier paramètre, que fais-tu de ce float ? Si tu essayes d'affecter ce paramètre à  une propriété de ton objet modèle, propriété qui se trouve être toujours une NSString parce que tu ne l'as pas changé, forcément il ne va pas aimer...


    Aussi :
    1) Fait un Clean avant histoire d'être sûr
    2) Fait un "Analyze" (plutôt qu'un simple Build)
    3) Regarde s'il te remonte des warnings. Et si oui, corrige-les. Un warning peut être tout aussi dangereux qu'une erreur (par exemple un warning qui te signale un type-mismatch entre une propriété de type String et une valeur de type float que tu lui affecterais...)
  • @poaz ;


     


    attention, une seule de tes méthodes init doit appeler [super init].


    C'est souvent celle avec le plus d'arguments.


    Les autres n'appellent pas [super init] mais [self initWithManyArguments: ...]


     


    Colas


  • paozpaoz Membre


    Fais un clean de ton code avant de relancer. Car là  si tu n'as pas changé le nom de ta méthode (qui s'appelle toujours "initWithString:..." sauf que cette fois elle prend un float) peut-être qu'il y a des restes de l'ancienne implémentation et ancienne API quand tu re-run l'appli parce qu'il n'a pas vu de changement.


    Aussi et surtout, es-tu sûr d'avoir changé tout ce qu'il faut dans ta chaà®ne de ton API quand tu es passé d'une NSString à  un float ?

    Par exemple dans l'implémentation de ta version "initWithString:(float)..." qui prend un float en premier paramètre, que fais-tu de ce float ? Si tu essayes d'affecter ce paramètre à  une propriété de ton objet modèle, propriété qui se trouve être toujours une NSString parce que tu ne l'as pas changé, forcément il ne va pas aimer...



    Aussi :

    1) Fait un Clean avant histoire d'être sûr

    2) Fait un "Analyze" (plutôt qu'un simple Build)

    3) Regarde s'il te remonte des warnings. Et si oui, corrige-les. Un warning peut être tout aussi dangereux qu'une erreur (par exemple un warning qui te signale un type-mismatch entre une propriété de type String et une valeur de type float que tu lui affecterais...)




     


    Merci, effectivement j'ai eu l'idée de Clean le projet ensuite (c'était mon petit temps d'adaptation à  Xcode).


    Et ca marchait beaucoup mieux. Du coup j'ai pris le réflexe maintenant : dès qu'un bug bizarre se produit, je clean, et je vérifie !


     




    @poaz ;


     


    attention, une seule de tes méthodes init doit appeler [super init].


    C'est souvent celle avec le plus d'arguments.


    Les autres n'appellent pas [super init] mais [self initWithManyArguments: ...]


     


    Colas




     


    Merci beaucoup de la précision !

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