variable de classe VS variables d'instance

yodarkyodark Membre
mai 2009 modifié dans API UIKit #1
Bonjour,

J'ai un petit problème au niveau de l'utilisation des variables de classes et des variables d'instances. Je n'ai pas dû saisir toute la subtilité.

J'ai une classe singleton "ServerApi", vu qu'elle est signleton toutes mes méthodes sont des méthodes de classe +(void)envoidonnee:(NSString)

par contre j'ai constaté que pour envoyer un message a une instance de viewController il faut aussi que cette méthode soit déclarée avec un (+)

donc je fais dans mon contrôleur de vue
+ (void)serverResponse:(NSArray *)reponseArray


et depuis serveur API
[instanceViewController serverResponse:reponseArray];


Que va t-il se passer si j'ai plusieurs instance de instanceViewController ?

Mais le problème c'est que dans mon instanceViewController je ne peux plus agir sur mes variables d'instances je voulais faire

infoToolbar.hidden = true;


Mais c'est impossible.

Comment faire pour envoyer un message à  une instance depuis une classe singleton avec des méthodes (+) ?

Réponses

  • Philippe49Philippe49 Membre
    mai 2009 modifié #2
    dans 1242116852:

    J'ai une classe singleton "ServerApi", vu qu'elle est signleton toutes mes méthodes sont des méthodes de classe +(void)envoidonnee:(NSString)


    Non, un singleton c'est l'unique instance d'une classe. Mais c'est une instance, et ses variables s'atteignent comme d'habitude.

    @interface MaSingletonClass : NSObject {<br />&nbsp; &nbsp;&nbsp; NSString * name;<br />}<br />+(MaSingletonClass*) uniqueInstance;<br />-(NSString *) name;<br />-(void) setName:(NSString *) aName;&nbsp; &nbsp; <br /><br />@end<br /><br /><br />
    


    <br />&nbsp; &nbsp; &nbsp; MaSingletonClass* singleton=[MaSingletonClass uniqueInstance];<br />&nbsp; &nbsp; &nbsp; NSLog([singleton name]);<br />
    


    (rq on peut faire autrement, mais bon ... pourquoi)

  • Philippe49Philippe49 Membre
    23:47 modifié #3
    dans 1242116852:

    par contre j'ai constaté que pour envoyer un message a une instance de viewController il faut aussi que cette méthode soit déclarée avec un (+)

    donc je fais dans mon contrôleur de vue
    + (void)serverResponse:(NSArray *)reponseArray
    


    et depuis serveur API
    [instanceViewController serverResponse:reponseArray];
    


    Je ne comprends pas . Tu recopie responseArray dans une variable ? définie où et comment ?
  • yodarkyodark Membre
    mai 2009 modifié #4
    Oui reponse array est un variable obtenue depuis un string

    + (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data<br /><br />{<br />	int index=[connnectionsArray indexOfObject:connection];<br />	[receivedData appendData:data];<br />	NSString * stringData = [[[NSString alloc] initWithData:data encoding:4] autorelease];<br />	NSArray * reponseArray = [stringData componentsSeparatedByString:@&quot;&#092;n&quot;] ;<br />[instanceViewController serverResponse:reponseArray];<br />
    


    Pour la classe singleton je fais sans la déclarer au préalable
    [ServerAPI maRequete:self]

    ensuite ServerAPI utilise le ViewController envoyé en paramettre pour envoyer la réponse
    [instanceViewController serverResponse:reponseArray];

  • Philippe49Philippe49 Membre
    23:47 modifié #5
    Et dans le view controller que fait la méthode + (void)serverResponse:(NSArray *)reponseArray ?
  • yodarkyodark Membre
    23:47 modifié #6
    L'appel (ajouté après dans mon post précédent)

    Pour la classe singleton je fais sans la déclarer au préalable
    [ServerAPI maRequete:self]

    ensuite ServerAPI utilise le ViewController envoyé en paramettre pour envoyer la réponse
    [instanceViewController serverResponse:reponseArray];

    Et la réponse est retournée dans mon ViewController :

    + (void)serverResponse:(NSArray *)reponseArray {<br />	NSLog(@&quot;THIS VIEW CONTROLLER RECEIVED REPONSE&quot;);<br />	if ([[reponseArray objectAtIndex:0] isEqualToString:@&quot;1&quot;])<br />		infoToolbar.hidden = true; //la erreur !<br />}
    

  • Philippe49Philippe49 Membre
    23:47 modifié #7
    infoToolBar est sans doute une variable d'instance dont la classe du view Controller n'a pas connaissance. Tu dois d'ailleurs avoir un Warning à  ce sujet.

    L'infoToolBar doit être définie dans l'interface du View Controller, et ta méthode doit être avec un (-)
    - (void)serverResponse:(NSArray *)reponseArray
  • yodarkyodark Membre
    23:47 modifié #8
    Le problème est que si je fais

    - (void)serverResponse:(NSArray *)reponseArray
    


    Je ne peux pas appeler

    [instanceViewController serverResponse:reponseArray];
    Il me dit
    instanceViewController may not respond to +serverResponse car il attends.
    Il semble qu'une fois qu'on est dans les (+) on ne peux plus en sortir...
  • Philippe49Philippe49 Membre
    23:47 modifié #9
    dans 1242120760:

    Il semble qu'une fois qu'on est dans les (+) on ne peux plus en sortir...

    Non, on utilise (+) lorsqu'on demande à  la classe d'exécuter une méthode. Ici rassure-moi, instanceViewController n'est pas le nom d'une classe sinon je  :fouf):
    L'erreur est ailleurs

    dans 1242120760:

    instanceViewController may not respond to +serverResponse car il attends.

    may not respond to +serverResponse : Doù vient ce (+) si tu as déclaré avec (-) dans l'interface et dans l'implémentation. Tu peux m'écrire le message d'erreur texto  ?

    car il attend raison de l'attente ? le data n'est pas forcément reçu d'un seul tenant, mais je ne vois pas en quoi cela empêcherait de transmettre au view controller ...
  • AliGatorAliGator Membre, Modérateur
    23:47 modifié #10
    Vu le message d'erreur, j'ai bien peur que malgré les apparences (nom et convention de nommage avec la minuscule), "instanceViewController" soit le nom de sa classe, et pas de son instance... ce qui expliquerait pourquoi le compilateur voudrait appeller une méthode de classe et pas d'instance ("+" et pas "-")
  • Philippe49Philippe49 Membre
    mai 2009 modifié #11
    dans 1242119762:

    Pour la classe singleton je fais sans la déclarer au préalable
    [ServerAPI maRequete:self]

    et ServerAPI aussi serait une classe ...
    C'est pas que ce ne soit pas possible de faire exécuter des méthodes à  une classe, mais c'est pour le moins atypique en Obj-C (à  part les initialisations). En tout cas, ce n'est sûrement pas ce qu'on appelle un singleton : doc
  • yodarkyodark Membre
    23:47 modifié #12
    Oula oui c'est moi qui ai  :fouf):

    J'ai en effet appellé la classe et non l'instance... Ca marche maintenant :)


    [ServerAPI maRequete:self] ca ne se fait pas ? C'est joli pourtant ! Pas besoin de créer d'instance, c'est une habitude de JAVA
  • Philippe49Philippe49 Membre
    23:47 modifié #13
    dans 1242137092:

    [ServerAPI maRequete:self] ca ne se fait pas ? C'est joli pourtant ! Pas besoin de créer d'instance, c'est une habitude de JAVA


    Conceptuellement, je trouve cela bizarre. Il me semble que, pour Obj-C, une classe c'est "le moule" ou "l'usine" pour fabriquer les objets. Bien sur, on peut demander à  l'usine de faire fonctionner ses objets, mais à  mélanger les fonctionnalités, à  ne pas séparer les rôles, on risque de se mélanger les pinceaux ...
Connectez-vous ou Inscrivez-vous pour répondre.