Organisation et communication entre classes

CoreCore Membre
J'ai une classe qui doit etre instanticiée une seule fois au démarrage de l'appli. Il s'agit en fait d'un "moteur MIDI"

J'ai des autres classes (des boutons) qui doivent acceder à  la methode play par exemple de cet objet unique et déja existant.

Je ne vois pas trop comment faire appel a cet objet dans mes autres classes (sans creer une autre instance du moteur midi) :o

En espérant avoir été clair sur mon problème ...

Merci d'avance !

Réponses

  • Dj T@lDj T@l Membre
    12:30 modifié #2
    Je ne suis pas sur de comprendre ton probleme mais bon on va esseyer de repondre.
    Si j'ai bien compris tu a un objet unique qui est ton moteur midi et tu voudrai pouvoir y acceder via les boutons qu tu a sur ton interface graphique.
    Ton interface elle est bien relié a un controller ? si c'est le c'est il faut que ton controller possede une reference sur ton moteur(que tui lui passe lors de son initialisation par exemple) et apres tu apelle les fonctions de ton mteur dans les methode associé a tes boutons.
    Voila j'espere avoir été clai(enfin au moins t'avoir aidé :) )
  • Eddy58Eddy58 Membre
    12:30 modifié #3
    Oui en effet, Dj T@l cites bien la procédure a suivre.
    Plus en détail, il faut déjà  faire dans IB un outlet (appelé par exemple moteurMidiClasse) entre la classe qui gère tes boutons et la classe du moteur midi. Ensuite, il faut faire un import du fichier d'interfaçage du moteur midi dans ta classe qui gère les boutons, puis par un code dans ce genre, tu dois pouvoir faire appel a ta méthode play.
    [tt]
    -(void)play:(id)sender
    {
    [moteurMidiClasse play:laMusique];
    }
    [/tt]
  • mpergandmpergand Membre
    12:30 modifié #4
    Oui, problème classique, déjà  évoqué sur ce forum.

    Donc deux soluces:
    1) faire uniquement des méthodes de classe (+) et des variables 'static'
    2) utiliser un singleton
  • CoreCore Membre
    12:30 modifié #5
    Si j'ai bien compris tu a un objet unique qui est ton moteur midi et tu voudrai pouvoir y acceder via les boutons qu tu a sur ton interface graphique.


    Bingo c'est exactement ca !

    Ton interface elle est bien relié a un controller ? si c'est le c'est il faut que ton controller possede une reference sur ton moteur(que tui lui passe lors de son initialisation par exemple) et apres tu apelle les fonctions de ton mteur dans les methode associé a tes boutons.


    Comment faire une reference a ce moteur ? c'est en fait l'essence meme de ma question
    Merci !!
  • CoreCore Membre
    12:30 modifié #6
    dans 1111151405:

    Oui, problème classique, déjà  évoqué sur ce forum.

    Donc deux soluces:
    1) faire uniquement des méthodes de classe (+) et des variables 'static'
    2) utiliser un singleton


    J'avais effectivement vu le singleton qui ressembler bcp à  ma question mais n'ai pas compris comment faire reference a cet objet unique
  • CoreCore Membre
    12:30 modifié #7
    dans 1111150947:

    il faut déjà  faire dans IB un outlet (appelé par exemple moteurMidiClasse) entre la classe qui gère tes boutons et la classe du moteur midi.


    tu peux m'en dire un peu plus à  ce sujet ?
  • mpergandmpergand Membre
    12:30 modifié #8
    dans 1111152400:


    J'avais effectivement vu le singleton qui ressembler bcp à  ma question mais n'ai pas compris comment faire reference a cet objet unique


    Une petite recherche sur ce même forum  ;)
  • ChachaChacha Membre
    12:30 modifié #9
    Un p'tit coup de main:

    -Dans ton MainMenu.nib, tu instancies un MoteurMidi
    -Dans MoteurMidi.m:

    <br />static MoteurMidi* moteurMidiInstance = nil; //permet de stocker une référence à  l&#39;instance unique<br /><br />@implementation MoteurMidi<br /><br />+(MoteurMidi*) moteurMidi //méthode de classe pour accéder à  l&#39;instance unique<br />{<br />  return moteurMidiInstance;<br />}<br /><br />-(void) awakeFromNib<br />{<br />  if (!moteurMidiInstance)<br />    moteurMidiInstance = self; //initialise la référence à  l&#39;instance unique lorsque cette dernière est créée<br />}<br />@end<br />
    


    Et chaque fois que dans une autre classe tu as besoin du moteur midi, tu peux faire

    <br />//récupère la référence vers l&#39;instance unique<br />MoteurMidi* moteurMidi = [MoteurMidi moteurMidi];<br />
    


    Voilà 

    +
    Chacha
  • CoreCore Membre
    12:30 modifié #10
    <3   <3 <br />
    Merci !
  • mpergandmpergand Membre
    12:30 modifié #11
    Chacha: tu montres un cas très particulier où tu utilises IB pour créer l' instance et si tu veux mon avis, c'est très étrange  ;)
  • ChachaChacha Membre
    12:30 modifié #12
    dans 1111155001:

    Chacha: tu montres un cas très particulier où tu utilises IB pour créer l' instance et si tu veux mon avis, c'est très étrange  ;)

    Oui, mais c'est bien plus simple dans un cas comme celui-là , et ça a l'avantage énorme de pouvoir permettre très simplement de connecter des items du MainMenu à  d'éventuelles IBAction du MoteurMidi.
  • CoreCore Membre
    12:30 modifié #13
    ma question suscite le débat c'est qu'elle pas si stupide que ca :P
  • mpergandmpergand Membre
    12:30 modifié #14
    dans 1111155447:

    dans 1111155001:

    Chacha: tu montres un cas très particulier où tu utilises IB pour créer l' instance et si tu veux mon avis, c'est très étrange  ;)

    Oui, mais c'est bien plus simple dans un cas comme celui-là , et ça a l'avantage énorme de pouvoir permettre très simplement de connecter des items du MainMenu à  d'éventuelles IBAction du MoteurMidi.


    J'entrevois des bugs bien sympa aussi  :P
  • 12:30 modifié #15
    On est reparti dans une surenchère de code?

    [tt]static id _sharedInstance;

    @implementation
    +(id)sharedInstance {
        if (!_sharedInstance)
            _shared = [[[self class] alloc] init];
        return _sharedInstance;
    }

    -(id)init {
        if (_sharedInstance) return [_sharedInstance retain];
        //le code habituel
        _sharedInstance = self;
        return self;
    }
    [/tt]

    Avec ça tu peux aussi initialiser à  partir de IB, même dans autant de NIB que tu veux, aucun risque.
  • ChachaChacha Membre
    12:30 modifié #16
    dans 1111156040:

    J'entrevois des bugs bien sympa aussi  :P


    Quel genre de bugs ? ça m'intéresse, parce que si cette technique est mauvaise, j'aime autant le savoir, vu que je l'utilise...
  • mpergandmpergand Membre
    mars 2005 modifié #17
    Renaud a raison  ;)

    Chacha, que se passe-t-il si dans une autre classe je fais:

    -(void) awakeFromNib
    {
    MoteurMidi* moteurMidi = [MoteurMidi moteurMidi];

    }



    En programmation, j'aime pas trop les jeux de hasard :) :)
  • Eddy58Eddy58 Membre
    12:30 modifié #18
    Voici un projet qui te montre comment faire une simple communication inter-classe (avec un simple outlet et sans singleton), d'après ta question originelle c'est surtout ça que tu recherches apparemment.... :)

    [Fichier joint supprimé par l'administrateur]
  • CoreCore Membre
    mars 2005 modifié #19
    dans 1111158398:

    Voici un projet qui te montre comment faire une simple communication inter-classe (avec un simple outlet et sans singleton), d'après ta question originelle c'est surtout ça que tu recherches apparemment.... :)


    whaou merci m'sieur !! o:)

    [edit]
    en fait c'était tout con  !!
  • ChachaChacha Membre
    12:30 modifié #20
    dans 1111158230:

    Renaud a raison  ;)

    Chacha, que se passe-t-il si dans une autre classe je fais:

    -(void) awakeFromNib
    {
    MoteurMidi* moteurMidi = [MoteurMidi moteurMidi];

    }



    En programmation, j'aime pas trop les jeux de hasard :) :)


    Ok, bien vu !
    J'avais peur de bugs plus sournois, genre qui ne sautent pas aux yeux au run-time. Mais celui-là  fait quand même réfléchir, je vais p'têt revoir mon code.
  • mpergandmpergand Membre
    12:30 modifié #21
    J'avais peur de bugs plus sournois

    Je le trouve déjà  pas mal ! Si tu ne crées pas l'instance dans init, dans awakeFromNib, la valeur de moteurMidi dans:
    MoteurMidi* moteurMidi = [MoteurMidi moteurMidi];
    est indéterminé ... (nil ?)



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