Singleton ?

gibet_bgibet_b Membre
03:03 modifié dans API AppKit #1
Salut à  tous,

Dans mon AppController.h, je déclare :
<br />@interface AppController : NSObject {<br />	// Le panneau de préférence de l&#39;application<br />	PreferenceController *preferenceController;<br />	<br />	// Tableau des catégories<br />	NSMutableArray *tableCategorie;<br />}<br />


J'aurai besoin de tableCategorie dans mon PreferenceController. Comment dois-je faire ? Dois-je déclarer une classe singleton Categorie ? Je dois avouer que ce que j'ai trouvé à  propos des singleton me parait un peu obscur...

Merci d'avance !

Réponses

  • BruBru Membre
    03:03 modifié #2
    Généralement, les classes contrôleur sont souvent singleton, donc, en effet, ça peut être, dans ton cas, la solution.

    Dans le .m de ton contrôleur, mets cette ligne avant le @implementation :
    static id __sharedInstance;
    


    Ensuite, dans le @implementation :
    <br />+ (void)initialize<br />{<br />&nbsp; &nbsp; __sharedInstance=nil;<br />}<br /><br />+ (id)sharedInstance<br />{<br />&nbsp; &nbsp; return __sharedInstance;<br />}<br />
    


    Enfin, au début de ton awakeFromNib :
    if (__sharedInstance==nil) __sharedInstance=self;
    


    Maintenant, où que tu sois dans ton appli, tu peux récupérer l'instance (unique) de ton contrôleur par :
    <br />{<br />&nbsp; &nbsp; AppController *monUniqueAppController;<br /><br />&nbsp; &nbsp; monUniqueAppController=[AppController sharedInstance];<br />}<br />
    


    Il ne te reste plus qu'à  implanter une méthode d'accès à  ton NSArray.

    .
  • gibet_bgibet_b Membre
    03:03 modifié #3
    Bru, une fois de plus, tu es mon sauveur !

    Merci !
  • gibet_bgibet_b Membre
    03:03 modifié #4
    Bon, ça marche impeccable. Juste une question tout de même : il me met un warning sur ces deux lignes qui se trouvent dans le init de PreferenceController :

    monAppController = [AppController sharedInstance];<br />tableCategorie = [monAppController tableCategorie];
    


    'AppController' may not respond to '+sharedInstance'

    'AppController' may not respond to '-tableCategorie'

    Y a pas moyen d'éviter ces warnings ? Est-ce parce que cette solution n'est pas propre ? N'était-ce pas mieux de mettre le singleton sur une classe Categorie que j'aurai créé ?
  • BruBru Membre
    03:03 modifié #5
    dans 1149271833:

    Y a pas moyen d'éviter ces warnings ? Est-ce parce que cette solution n'est pas propre ? N'était-ce pas mieux de mettre le singleton sur une classe Categorie que j'aurai créé ?


    sharedInstance et tableCategorie sont des méthodes exposées (donc publiques).

    Dans ce cas, il faut que tu les déclares dans AppController.h :
    @interface AppController : NSObject<br />{<br />	// Le panneau de préférence de l&#39;application<br />	PreferenceController *preferenceController;<br />	<br />	// Tableau des catégories<br />	NSMutableArray *tableCategorie;<br />}<br />+ (id)sharedInstance;<br />- (id)tableCategorie;<br />@end
    


    Ensuite, dans chaque source où tu vas utiliser ces 2 méthodes, tu devras faire un :
    #import &quot;AppController.h&quot;
    

    en tête du source.

    .
  • gibet_bgibet_b Membre
    03:03 modifié #6
    Je suis vraiment un boulet  :-\\ A moins que ce soit la fatigue...

    Merci encore pour tes réponses et ta patience !
Connectez-vous ou Inscrivez-vous pour répondre.