[RESOLU] probleme de warning sur methode de variable d'instance

NashNash Membre
juillet 2011 modifié dans Objective-C, Swift, C, C++ #1
bonjour,

nouveau dans le monde du mac et de son développement.
j'espère que je poste sur le bon forum ?

Dans un projet de test j'ai deux class. Jusque la pas de soucis particulier.
une class Personne et une class Societe.

j'ai des warning sur mes méthode de variable d'instance que je ne comprend pas.

<br />#import &lt;Cocoa/Cocoa.h&gt;<br /><br /><br />@interface Societe : NSObject {<br />	NSString* nom;<br />	NSString* adresse1;<br />}<br /><br />//@property (retain)NSString* adresse1;<br /><br />-(NSString*)nom;<br />-(void)setNom:(NSString *)newNom;<br /><br />-(NSString*)adresse1;<br />-(void)setAdresse1:(NSString*)newAdresse;<br /><br />@end<br /><br />IMPLEMENTATION<br /><br />#import &quot;Societe.h&quot;<br /><br /><br />@implementation Societe<br /><br />//@synthesize adresse1;<br /><br />-(NSString*)nom{<br />	return nom;<br />}<br /><br />-(void)setNom:(NSString *)newNom{<br />	[nom release];<br />	[newNom retain];<br />	nom = newNom;<br />}<br /><br />-(NSString*)adresse1{<br />	return adresse1;<br />}<br /><br />-(void)setAdresse1:(NSString *)newAdresse1{<br />	[adresse1 release];<br />	[newAdresse1 retain];<br />	adresse1 = newAdresse1;<br />}<br /><br />@end<br /><br />


La class Societe est initialisé et instancié dans la class Personne
<br />#import &lt;Cocoa/Cocoa.h&gt;<br /><br />@class Societe;<br /><br />@interface Personne : NSObject {<br />	NSString *nom;<br />	NSString *prenom;<br />	NSInteger poids;<br />	NSInteger age;<br />	<br />	Societe *societe;<br />}<br /><br />@property (retain)NSString *nom;<br />@property (retain)NSString *prenom;<br />@property (assign)NSInteger poids;<br />@property (assign)NSInteger age;<br /><br />-(Societe*)societe;<br />-(void)setSociete:(Societe *)newSociete;<br /><br />@end<br /><br />#import &quot;Personne.h&quot;<br />#import &quot;Societe.h&quot;<br /><br />@implementation Personne<br /><br />@synthesize nom;<br />@synthesize prenom;<br />@synthesize poids;<br />@synthesize age;<br /><br />-(id)init{<br />	<br />	societe = [[Societe alloc]init];<br />	[nom retain];<br />	[prenom retain];<br />	<br />	[super self];<br />	return self;<br />}<br /><br />-(Societe*)societe{<br />	return societe;<br />}<br /><br />-(void)setSociete:(Societe *)newSociete{<br />	societe = newSociete;<br />}<br /><br />-(void)dealloc{<br />	<br />	[nom release];<br />	[prenom release];<br />	<br />	[societe dealloc];<br />	<br />	[super dealloc];<br />}<br /><br />@end<br /><br />


Dans le fichier de test, je procède de cette manière.
<br />#import &lt;Foundation/Foundation.h&gt;<br />#import &quot;Personne.h&quot;<br /><br />int main (int argc, const char * argv&#91;]) {<br />	<br />&nbsp; &nbsp; NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];<br />	<br />	Personne *per = [[Personne alloc]init];<br />	Societe *ste = [per societe];<br />	<br />	[ste setNom: @&quot;Ton employeur&quot;];<br />	[ste setAdresse1: @&quot;Rue de ton employeur&quot;]; &lt;-- 1 warning ici<br />	<br />	[per setNom: @&quot;Nom&quot;];<br />	[per setPrenom: @&quot;Prenom&quot;];<br />	[per setPoids: 100];<br />	[per setAge: 10];<br />	[per setSociete: ste];<br />	<br />	NSLog(@&quot;Bonjour, %@ %@, tu as %d ans, et tu pèse %d kilos&quot;,[per nom],[per prenom],[per age],[per poids]);<br />	NSLog(@&quot;tu bosse chez %@ &quot;, [[per societe] nom]);<br />	NSLog(@&quot;Adresse : %@&quot;, [[per societe] adresse1]); &lt;-- 1 warning ici<br />	<br />	[per dealloc];<br />	[ste drain];<br />&nbsp; &nbsp; [pool drain];<br />&nbsp; &nbsp; return 0;<br />}<br />


j'ai un warning sur le getter et le setter de la variable d'instance adresse1.
rien de bien grave vous, mais j'aime bien savoir le pourquoi du comment.
je code avec xcode 3.2.6 sur snow leopard.
merci

Réponses

  • CeetixCeetix Membre
    04:34 modifié #2
    Et quel est le warning ?
  • jpimbertjpimbert Membre
    04:34 modifié #3
    Je ne vois pas d'où pourrait venir un warning, ce serait sympa de nous le donner.

    Une recommendation tout de même, il vaut mieux retenir la nouvelle adresse avant de libérer l'ancienne, sinon ça pourrait faire des trucs bizarres si l'ancienne et la nouvelle sont un seul et même objet.
  • CeetixCeetix Membre
    04:34 modifié #4
    Et je rajouterai une condition dans tes setter.
    Ex :

    <br />-(void)setAdresse1:(NSString *)newAdresse1{<br />&nbsp; &nbsp; &nbsp; &nbsp; if(adresse1 != newAdresse1)<br />	{<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  [adresse1 release];<br />	&nbsp;  [newAdresse1 retain];<br />	&nbsp;  adresse1 = newAdresse1;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />}<br />
    


    Tu éviteras le cas où newAdresse et adresse1 pointent sur le même NSString. Car si c'est le cas tu détruis un objet et essaie de le réalloué mais il a été détruit.
  • AliGatorAliGator Membre, Modérateur
    04:34 modifié #5
    C'est quoi l'intérêt d'implémenter les propriétés soi-même au lieu d'utiliser @synthesize alors que les setters/getters en question sont tout ce qu'il y a de plus classique ici ?
    Utiliser @synthesize au moins génère les setters qui sont sûrs, qui vont éviter les cas où adresse1 et newAdresse1 seraient le même objet, et même permettre de gérer le KVO (ce que tu ne fais pas ici), voire l'atomicité du setter (pour les cas multithread)...

    Voir le sujet dédié aux propriétés, setters et getter dans la doc Apple, tout y est expliqué en détail.
  • CeetixCeetix Membre
    04:34 modifié #6
    Old school freestyle Ali ^^
  • NashNash Membre
    04:34 modifié #7
    bonsoir,

    merci pour vos réponses.
    dans 1310756109:

    C'est quoi l'intérêt d'implémenter les propriétés soi-même au lieu d'utiliser @synthesize alors que les setters/getters en question sont tout ce qu'il y a de plus classique ici ?
    Utiliser @synthesize au moins génère les setters qui sont sûrs, qui vont éviter les cas où adresse1 et newAdresse1 seraient le même objet, et même permettre de gérer le KVO (ce que tu ne fais pas ici), voire l'atomicité du setter (pour les cas multithread)...

    Voir le sujet dédié aux propriétés, setters et getter dans la doc Apple, tout y est expliqué en détail.

    j'ai effectivement essayé de cette manière, j'ai le même warning.

    dans 1310743797:

    Et quel est le warning ?

    <br />/Users/frederic/Documents/developpement/TestFred/TestFred.m: In function &#039;main&#039;:<br />/Users/frederic/Documents/developpement/TestFred/TestFred.m:12: warning: no &#039;-setAdresse1:&#039; method found<br />/Users/frederic/Documents/developpement/TestFred/TestFred.m:12: warning: (Messages without a matching method signature<br />/Users/frederic/Documents/developpement/TestFred/TestFred.m:12: warning: will be assumed to return &#039;id&#039; and accept<br />/Users/frederic/Documents/developpement/TestFred/TestFred.m:12: warning: &#039;...&#039; as arguments.)<br />/Users/frederic/Documents/developpement/TestFred/TestFred.m:22: warning: no &#039;-adresse1&#039; method found<br />
    


    Si je poste c'est peu être que je pense avoir fait le max dans mes recherches.
    Et pour ma part ce genre de warning me parait incompréhensible.
    Je viens pas ici pour me faire gazé ou dire comment lire la documentation.

    merci
  • AliGatorAliGator Membre, Modérateur
    04:34 modifié #8
    Tu as bien fait un #import du .h au moins ?
    Tu as essayé avec un autre nom de méthode (enlever le "1" par exemple) ?
  • CeetixCeetix Membre
    juillet 2011 modifié #9
    On est pas là  pour te gazer .... Si on le voulait on t'aurai déjà  dit de lire la doc comme cette partie et d'aller te présenter.

    Tu as essayé d'importer Societe.h ?
  • CeetixCeetix Membre
    04:34 modifié #10
    Grillé par Ali. ^^
  • NashNash Membre
    04:34 modifié #11
    l'import du .h est ok

    Dans société j'ai deux variables d'instance.
    nom et adresse1 visible dans mon premier post.
  • CeetixCeetix Membre
    04:34 modifié #12
    J'ai refais ton projet et moi ça marche j'ai pas d'erreur si dans le main j'importe Societe.h ... Si je l'enlève j'ai tes erreurs. C'est tout.
  • AliGatorAliGator Membre, Modérateur
    04:34 modifié #13
    dans 1310760276:

    Je viens pas ici pour me faire gazé ou dire comment lire la documentation.
    J'avais pas vu cette partie de ta réponse.

    Un simple "merci mais j'ai déjà  lu la documentation, c'est pour ça que je viens vous voir" aurait suffit. D'autant que ma remarque n'était pas "putain t'aurais pu aller lire la doc" ou un "RTFM", mais plutôt un "je te conseille d'aller lire cette partie de la doc, tu y trouveras tout détaillé si tu connais pas ça peut te donner des pistes". Donc je comprend pas ta réaction ?

    Tu n'as même pas été te présenter dans la section dédiée "Présentation des membres", et tu n'as même pas exposé non plus ta démarche de recherche dans ton post initial, comment peut-on savoir quel niveau tu as en Objective-C, quelles recherches tu as déjà  faites, et si tu as déjà  lu la documentation ?

    Merci donc d'aller te présenter dans la section adéquate pour que l'on ait une meilleure idée de ton niveau en ObjC, et de détailler ce que tu as déjà  essayé pour résoudre ton problème (clean, version Xcode, refactor, @synthesize, ...?)
  • laudemalaudema Membre
    04:34 modifié #14
    Nash:
    dans 1310760276:

    ...pour ma part ce genre de warning me parait incompréhensible.


    Compilateur:
    <br />no &#039;-setAdresse1:&#039; method found<br />(Messages without a matching method signature<br />will be assumed to return &#039;id&#039; and accept &#039;...&#039; as arguments.)<br />
    


    Google traduit:

    non "-setAdresse1:" méthode trouve
    (Les messages sans signature méthode d'appariement
    seront assumés à  revenir 'id' et accepter'...' comme arguments.)


    Nash:
    dans 1310760276:

    Je viens pas ici pour me faire gazé ou dire comment lire la documentation.

    Pour les gaz tu n'auras à  craindre que celui des bulles de Perrier-Citron (attention l'intoxication est longue et masquée:). On peut se faire décontaminer dans le forum "Présentation des nouveaux membres".
    Pour la doc effectivement on ne peut la lire pour toi.
    Pour la traduction en bon français : le compilateur remarque qu'il n'a pas trouvé une méthode que tu appelles dans ton code, mais comme c'est de l'objective-C, donc dynamique, il suppose que tu es un grand garçon et que tu as prévu quelque chose, comme un réceptionniste en quelque sorte, afin qu'à  l'éxecution ton appli se vautre pas lamentablement.
    Après, pourquoi il ne trouve pas cette méthode c'est à  toi de chercher un peu ce qui fait ça. Souvent, comme dit Ali qui a beaucoup d'expérience, c'est un oubli d'importer la classe qui contient la méthode. ça peut aussi être parce que tu as fait une grossière faute d'orthographe sur le nom de la méthode du coup il ne la trouve pas non plus.
    PS: Si tu as la chance d'avoir des moments perdus (et un iPad dans le train ou la salle de bains) les liens renvoient à  un gros et lourd document qui vaut le coup d'oeil pour bien comprendre ce qu'on peut faire et comment le faire avec Cocoa. Mais ce n'est qu'un conseil, tu fais ce que tu veux de tes moments perdus !
  • NashNash Membre
    04:34 modifié #15
    dans 1310765540:

    J'ai refais ton projet et moi ça marche j'ai pas d'erreur si dans le main j'importe Societe.h ... Si je l'enlève j'ai tes erreurs. C'est tout.


    il ne me paraissait pas forcement évident de refaire l'import du societe.h dans le main.m.
    Il me semblait que l'utilisation de la directive @class dans personne.h et l'import du societe.h dans personne.m, ne m'obligerait pas de nouveau a faire un import en main.m (dépendance logique compilateur);

    Cela vient uniquement de certaine habitude de dev avec d'autre langage.
    Cette manip je dois le dire me gène un peu a cause des dépendances et de l'obligation de recompilation de certain fichier suivant les modifications effectués (ce ne sont des détails).

    merci

    ps: je ne trouve pas le tag RESOLU

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