Déchargement d'un nib... où,quand,comment ?

16:34 modifié dans API AppKit #1
Salut :)

J'essaye depuis tout à  l'heure de lancer un nib quand l'utilisateur en a besoin, ça ce n'est pas dur, on peut utiliser par exemple [NSBundle loadNibNamed:@Fichier_Nib owner:moi]; ou initWithWindowNibName dans NSWindowController mais impossible de mettre la main une manière de le "décharger" de mémoire ? Oui, je n'aime pas trop le système de cache de Mac OS X qui garde tout en mémoire... enfin tant que je n'ai pas mon G5 avec et ses 4GO de RAM...
Bref, le nib n'a aucune raison d'être en mémoire durant la vie de mon programme, il n'est utilisé par aucune autre ressource, il ne possède qu'une classe NSWindowController soit rien de bien méchant.
Evidement sans faire un bundle indépenant, juste pouvoir le dé/charger à  volonté à  serait super :p
Comment ça une question tordue ???

Merci pour votre aide;
Michaël;

Réponses

  • LeChatNoirLeChatNoir Membre, Modérateur
    16:34 modifié #2
    Salut,

    Je relance ce sujet un peu ancien certe, mais toujours d'actualité pour moi.

    J'ai un projet avec plusieurs nib (genre un pour le menu, un pour la fenêtre principale, un pour les pref...).

    Le chargement ne me pose pas de pb. Par contre, quand je ferme la fenêtre précédemment chargée, j'aimerai carrément tut désallouer (la fenêtre, le nib et les instances associées).

    Est ce possible ?
  • BruBru Membre
    16:34 modifié #3
    Le "déchargement" d'un nib, c'est tout simplement envoyer un message release à  chaque instance d'objet de "1er niveau" créé par le chargement du nib.

    Typiquement, les instances de "1er niveau" sont celles représentées par une icône dans la fenêtre principale de IB dans l'onget "Instances".

    On y trouve généralement une ou plusieurs fenêntres, parfois des views, souvent des contrôleurs... Il faut donc releaser tout ce beau monde.

    .
  • LeChatNoirLeChatNoir Membre, Modérateur
    16:34 modifié #4
    ok dans mon cas et dans un nib particulier, j'ai un objet perso datasource et le file's owner est un objet perso aussi qui est un NSWindowController.

    Donc lorsque je clicque sur le bouton fermer, ca déclenche une action dans mon NSWindowController. J'arrive à  releaser le datasource.
    Par contre, je pense que je garde mon NSWindowController et au chargement suivant, je recharge le nib ?

    Je me demande si ca va marcher ca... Je tente ce soir.

    Merci !
  • BruBru Membre
    16:34 modifié #5
    Dans l'action "Fermer" de ton windowController, la dernière opération que tu peux faire (après le release du datasource) est :

    [tt][self autorelease];[/tt]

    ce qui aura pour effet de décharger l'instance du windowController à  la prochaine boucle événementielle.

    .
  • LeChatNoirLeChatNoir Membre, Modérateur
    16:34 modifié #6
    ah. Je pensais pas faire ça car mon NSWindowsController est instancié dans le nib principal. Où alors, faudrait que je l'instancie programatiquement non ? Pour pouvoir le réinstancier à  la prochaine ouverture de la fenêtre ?
  • BruBru Membre
    16:34 modifié #7
    Dans ce cas, pas de problème, tu n'as pas à  la releaser (si tu devais le faire, ce serait au niveau du nib principal).

    .
  • LeChatNoirLeChatNoir Membre, Modérateur
    16:34 modifié #8
    Ok. Merci Bru. 
    Je regarde ça tout à  l'heure.
  • LeChatNoirLeChatNoir Membre, Modérateur
    16:34 modifié #9
    Bon ben ca marche pas  :(
    J'arrive bien à  "releaser" le datasource mais quand je recharge la fenêtre, que le nib soit rechargé ou pas.

    J'ai l'impression que le nib ne réinstancie pas ses objets au 2eme chargement d'où sortie avec plantage sévère...

    Du coup, j'ai viré la datasource du .nib et je l'instancie/release dans mon controller.

    Une idée du pourquoi le nib réinstancie pas ses objets ?
Connectez-vous ou Inscrivez-vous pour répondre.