Probleme de persistence II
TMX
Membre
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
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
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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 ???
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
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
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.
.
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 )
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
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
Classes, librairies, métodes utilisées ? cela peut sans doute aider par déterminer si le problème vient de ce niveau.
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
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.
.
ç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 !
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.
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.
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