Question sur les NSString
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)!
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 ":" :
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 !!
En plus,
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...
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 :
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)
As-tu bien créé deux méthodes init ?
Une :
en plus de celle déjà existante
?
Sinon, on n'écrit pas
en objective-C mais
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.
Avec plaisir, je m'exécute
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
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 !
Merci beaucoup de la précision !