Probleme de persistence II

TMXTMX Membre
19:48 modifié dans API AppKit #1
Salut à  tous les Cocoà¯stes,

J'ai à  nouveau besoin de vous car j'ai un très gros problème de persistence de mes informations.

En effet, dans plusieurs de mes WindowController, j'ai déclaré des NSMutableArray où je stocke la liste des séries ou la liste des styles de films. Ces tableaux sont déclarés comme variables globales dans les classes. Pourtant, lorsque je charge les données dans mes tableaux dans une méthode donnée, l'instruction [array count] me retourne le nombre de données chargées. Mais lorsque j'utilise cette même instruction dans une autre méthode, celle-ci me retourne systématiquement 0 alors que je n'ai en aucune façon libéré la mémoire. Du coup, je suis obligé de recharger mes tableaux dans toutes les méthodes où j'en ai besoin. :'(

:why?:

Quelqu'un a t'il déjà  rencontré ce problème ?
Quelqu'un pourrait-il m'aider ?

:adios!: A+
TMX


Maxximum, la radio que les autres radios écoutent

Réponses

  • septembre 2004 modifié #2
    dans 1094629377:


    En effet, dans plusieurs de mes WindowController, j'ai déclaré des NSMutableArray où je stocke la liste des séries ou la liste des styles de films. Ces tableaux sont déclarés comme variables globales dans les classes.


    Juste une information qui peut aider à  la compréhension: qu'entends tu quand tu dis "Ces tableaux sont déclarés comme variables globales dans les classes." ?
    Cela veut il que ton source ressemble à  ceci:

    fichier.h

    extern NSMutableArray* MAVAR_GLOBALE;

    @interface
    ....
    @end

    fichier.m
    NSMutableArray* MAVAR_GLOBALE;

    @implementation
    ...
    @end


    Si ce n'est pas le cas, essaye de cette façon... sinon je ne vois pas l'immédiat ce qui pose problème  ???

  • ClicCoolClicCool Membre
    19:48 modifié #3
    Il est difficile de bien cerner ton pb.
    Mais à  te lire il semble que beaucoup d'objets ont le droit d'accès direct à  ton tableau.
    Et celui ci réagit comme "s'il était plusieurs". Il y a des chances, comme le souligne deftones_chrix qu'il ne soit pas convenablement déclaré comme global.

    Ceci dit, il ne faut pas trop abuser les variables globales surtout si tout un tas d'instances d'objets doivent y avoir accès.
    Mieux vaut définir des accesseurs à  ton tableau:
    - Soit en l'encapsulant dans un objet auxquel les autres s'adressent 'ce qui semble adapté dans ton cas)
    - Soit, si les différents objets en ayant besoin sont les instances d'une même classe, en faisant de ton tableau une variable de classe avec des accesseurs de classe.

    D'une façon générale, à  chaque fois que l'on est tenté de créer une variable globale, il faut se dire qu'on a probablement mal structuré notre code et mal respecté le MVC paradygm ;)
  • TMXTMX Membre
    19:48 modifié #4
    Salut les gars,

    Non non ma variable est déclarée à  l'interieur du block @interface {}.
    Mon problème c'est que j'allimente ces tableaux à  l'aide des resultats d'une requête SQL. A l'intérieur de la méthode où je récupère mes infos, il n'y a aucun problème. Mais dès lors que j'appelle la méthode count ou tout autre appel de ces tableaux à  l'intérieur d'autres méthodes, c'est comme s'il n'y avait plus rien. En fait, c'est comme si Cocoa considérait que ces tableaux ne sont que locals et non globals à  la fenêtre entière.

    Cette situation est très pénible et m'empeche de terminer un projet pourtant bien avancé.  :'(

    Est ce que ca vous aide un peu ?

    A+
    TMX


    Maxximum, la radio que les autres radios écoutent
  • BruBru Membre
    19:48 modifié #5
    C'est pas très clair tout ça...

    Ton tableau tel que tu le décris est LOCAL à  ta classe contrôleur (et pas à  ta fenêtre). Donc seules les autres méthodes de ta classe contrôleur ont accès à  ce tableau.

    Maintenant, il faut bien vérifier :
    1 - que la requête a fonctionné. Place un NSLog(@%i, [tableau count]) à  la suite de la boucle qui fait le remplissage. Si tout va bien, un nombre supérieur à  0 va apparaà®tre dans la console de Xcode.

    2 - que ton tableau ne soit créé qu'une seule fois (tu ne dois avoir qu'un seul "tableau=" dans ton code de classe, et il doit être dans une méthode d'initialisation comme awakeFromNib). J'ai déjà  vu du code dans lequel à  chaque appui d'un bouton, le gars refaisait un tableau=[[NSMutableArray alloc] init] (tableau étant variable d'instance). Aussi il ne comprenait pourquoi il avait un tableau à  chaque fois !

    3 - que ton tableau ne soit pas en autorelease. Soit tu le déclares par un traditionnel tableau=[[NSMutableArray alloc] initWithCapacity:0], sinon, si tu utilises un "constructeur convénient" (style =[NSMutableArray array]), rajoute un retain.

    .
  • 19:48 modifié #6
    dans 1094643320:

    Non non ma variable est déclarée à  l'interieur du block @interface {}.
    ...
    En fait, c'est comme si Cocoa considérait que ces tableaux ne sont que locals et non globals à  la fenêtre entière.


    Ben ton programme réagit de façon cohérente avec ta définition. Du fait que la varaible est déclarée dans le block @interface, cela signifie qu'elle est définie comme propriétés des instances de ta classe. Chaque instance a donc son propre tableau vivant sa vie indépendamment des autres. Sauf si tu généres un tableau que tu utiliseras pour initialiser la propriétés tableau de toutes tes instances.
    Mais cette méthode est lourde et pas super propre.

    A la rigueur fait une instance d'une classe (I) qui contiendra ce tableau. Tu écris ensuite des accessors pour accéder à  ce tableau ensuite, dans les instances où tu as besoin de ton tableau, tu fait un outlet entre ces instance et (I). De cette façon, toutes les instances pointeront sur le même objet.

    En espérant avoir été clair (et je suis le premier à  reconnaitre que ce n'est pas toujours le cas :P )
  • TMXTMX Membre
    19:48 modifié #7
    Le plus bizarre dans cette histoire c'est que j'ai d'autres tableaux définis de cette façon dans mon controlleur (un tableau pour les acteurs, un pour les réalisateurs et un pour les musiciens) et eux n'ont pas ce problème. En effet, je peux y accéder à  n'importe quel endroit de mon controlleur, pour faire un ajout à  une table par exemple. Alors que les autres tableaux, je ne peux y accéder que dans la méthode où j'effectue ma récupération d'infos.

    Visiblement, le problème se pose pour les tableaux remplis par ma requete SQL et non pour ceux que j'alimente au fur et a mesure de mes ajouts. Je ne comprend vraiment plus.  :why?:  :'(

    A+
    TMX


    Maxximum, la radio que les autres radios écoutent
  • TMXTMX Membre
    19:48 modifié #8
    Rectification :

    Je peux accéder à  tous mes tableaux dans toutes les méthodes cependant seuls les tableaux que je remplis avec une requete SQL, perdent leur contenu au sortir de la méthode de remplissage.

    Pour BRU :
    J'ai déjà  mis des NSLog(@%i, [array count]) les traces me retournent respectivement 1 dans la méthode de recupération (ce qui est normal) et 0 dans les autres méthodes du même controlleur. Il y a donc perte d'informations alors qu'il n'y a aucune libération ni aucun autorelease d'indiquer.

    A+
    TMX


    Maxximum, la radio que les autres radios écoutent
  • 19:48 modifié #9
    dans 1094649910:

    Visiblement, le problème se pose pour les tableaux remplis par ma requete SQL

    Classes, librairies, métodes utilisées ? cela peut sans doute aider par déterminer si le problème vient de ce niveau.
  • TMXTMX Membre
    19:48 modifié #10
    J'utilise les classes du framework SMySQL. J'ai développé une classe VMSQL qui permet d'accéder à  mes tables via un fichier Database.xml. Dans cette classe, j'ai une méthode d'ajout (qui fonctionne impec), une méthode de modif (qui fonctionne aussi impec), une méthode de suppression (no probleme aussi) et trois méthodes de récupération des données (qui semblent fonctionner correctement).

    N'étant pas chez moi mais au boulot, je ne peux pas te filer la classe VMSQL. Dès que je rentre, promis, je l'envoie.

    A+
    TMX
  • ClicCoolClicCool Membre
    19:48 modifié #11
    Il semble donc que ton soucis ne soit pas lié à  tes déclarations de tableau mais plutôt à  ta façon de les créer et/ou remplir avec les requetes SQL.

    Pour ma part je trouve l'usage du framework SMySQL assez lourd :( mais effectivement si on pouvait en savoir + sur ce point ça pourrait aider.
    A moins que Bru n'ai déjà  rencontré ces soucis avec mySQL ? ;)
  • BruBru Membre
    19:48 modifié #12
    dans 1094653242:
    Pour ma part je trouve l'usage du framework SMySQL assez lourd :( mais effectivement si on pouvait en savoir + sur ce point ça pourrait aider.
    A moins que Bru n'ai déjà  rencontré ces soucis avec mySQL ? ;)


    Moi, depuis que j'ai fait ma propre classe de connexion à  Mysql, c'est que du régal. Tout est 100% cocoa avec le miminmun de méthodes à  utiliser.

    .
  • ClicCoolClicCool Membre
    19:48 modifié #13
    Décidément tu nous met l'eau à  la bouche avec ta classe de connexion Bru ;)

    ça a vraiment l'air d'une bonne solution ta stratégie de créer une classe réutilisable qui se charge de la salle besogne !
  • muqaddarmuqaddar Administrateur
    19:48 modifié #14
    ouais va vraiment falloir que je crée une section supplémentaire pour mettre des classes à  dispo ! ;-)
  • ClicCoolClicCool Membre
    19:48 modifié #15
    oh oui oh oui oh oui ....  ::)
  • Eddy58Eddy58 Membre
    19:48 modifié #16
    En effet, dans plusieurs de mes WindowController, j'ai déclaré des NSMutableArray


    Bon je ne pense pas que ce que je vais dire va aider, mais perso j'utilise seulement les NSWindowController pour ce qu'ils sont prévus. En ce qui concerne la gestion d'arrays ou autres donnees qui n'ont pas de rapport avec la gestion de la fenetre en elle-meme, je crée un controleur tout simple, afin de mettre tout le fourbis dedans. :)
    Le projet est ainsi mieux structuré et le code plus propre.
  • ClicCoolClicCool Membre
    19:48 modifié #17
    Salut TMX :)

    En plus des WindowControlleurs et d'un controlleur façon MVC tu pourais aussi ajouter un NSArrayController en sous traitant la gestion des tableaux aux bindings ;D

    Mais je persiste à  penser que ton pb ne vient pas de là  mais bien de ta requette et de ta façon de remplir le tableau avec ses résultats ... Essaies peut être de mettre un NSLog dans le déalloc des éléments ajoutés histoire de voir s'ils sont désalloués en sortant de la méthode de remplissage.
  • TMXTMX Membre
    19:48 modifié #18
    Salut ClicCool,

    je viens de suivre les conseilles de deftone_chrix et apparemment ca a l'air de marcher. Mais c'est quand même bizarre que pour certains tableaux, ca passe et pour d'autres rien à  faire.  :-\

    Enfin, je vais me contenter de cette stratégie pour le moment, en attendant de trouver une autre solution.

    J'avais trop de chose à  faire hier soir si bien que je n'ai pas pu envoyer le source comme promis. Mais ce soir, je pense avoir plus de temps

    A+
    TMX
Connectez-vous ou Inscrivez-vous pour répondre.