NSImage dans NSTableView

12:42 modifié dans API AppKit #1
Bonjour,

J'ai un petit soucis de gestion mémoire.
Je charge des images ds ma tableView, mais ces images sont online donc j'utilise :
<br />NSImage *imageF = [[NSImage alloc] initWithContentsOfURL:[NSURL URLWithString:- (id)tableView:(NSTableView *)aTableView<br />&nbsp; &nbsp; &nbsp; objectValueForTableColumn:(NSTableColumn *)aTableColumn<br />&nbsp; &nbsp; &nbsp; row:(int)rowIndex<br />{<br />	id theRecord, theValue;<br />	theRecord = [test objectAtIndex:rowIndex];<br />if([[aTableColumn identifier] isEqualToString:@&quot;icon&quot;]){<br />[theRecord objectForKey:@&quot;icon&quot;]]];<br />theValue = imageF;<br />}<br />return theValue;<br />}


Bon pas de soucis pour le chargement (quoi que un peu long au lancement de l'app et et je n'ai testé qu'avec 2 row alors qu'il risque d'y en avoir plus de 150.. Puis, j'ai lancé Activity Monitor et me suis aperçu que à  chaque fois que je clique sur une row, il me rajoute 0.1Mo à  la mémoire qu'utilise mon application  :p
J'ai donc essayé un [imageF release] juste après theValue = imageF; mais ça ne peut évidemment pas marcher (d'ailleurs ça n'a pas marché :D)
Alors si quelqu'un voit une solution ?

Merci.
Louka

Réponses

  • Eddy58Eddy58 Membre
    janvier 2006 modifié #2
    Ton code a une drôle de tête Eaglelouk, un petit problème lors du copier/coller ? ;)

    [tt]
    [theRecord objectForKey:@icon]
    [/tt]
    Dejà , cette ligne telle quelle n'a aucune utilité, la valeur de retour n'est pas exploitée ? Mais bon c'est peut-être du au problème de copier/coller aussi. D'ailleurs, c'est surement ça, un crochet ouvert pour trois fermés...
  • 12:42 modifié #3
    Dsl  :o en effet erreur lors du copier/coller
    NSImage *imageF = [[NSImage alloc] initWithContentsOfURL:[NSURL URLWithString:[theRecord objectForKey:@&quot;icon&quot;]]];<br />				theValue = imageF;
    
    :p
  • AliGatorAliGator Membre, Modérateur
    12:42 modifié #4
    Je suis pas trop sûr de comprendre le fonctionnement de ton truc, m'enfin bon.

    Si pour chaque row tu as une icône différente (theRecord différent), le plus propre est peut-être de ne télécharger l'image qu'une fois ?

    genre tu rajoutes une clé à  ton dictionary représentant ta 'row' (ou tu le stoques autre part dans un autre container, je sais pas comment sont organisées tes données).
    Genre un dico
    NSString* imageUrl = [theRecord objectForKey:@&quot;icon&quot;];<br />NSImage* iconImage [allImages objectForKey:imageUrl];<br />if (!iconImage)<br />{<br />&nbsp; iconImage = [[NSImage alloc] initWithContentsOfURL:[NSURL URLWithString:imageUrl]];<br />&nbsp; [allImages setObject:iconImage forKey:imageUrl];<br />}
    
    avec allImages un NSMutableDictonary initialisé à  vide au lancement de l'appli et releasé quand tu quittes.

    Bon c'est un exemple vite fait, qui te permet de mémoriser de côté les images déjà  chargées pour éviter de les charger à  chaque fois. Mais comme je ne sais pas exactement ce que tu cherches à  faire...
  • janvier 2006 modifié #5
    Bonne idée, j'avais eu a peu près la même que toi sauf que j'ai pas tilté sur la soluce la plus simple (ici, la tienne), en plus la mienne marchait pas  :p
    J'ai essayé :
    <br />NSImageCell *imCell = [aTableColumn dataCellForRow:rowIndex];<br />NSImage *imageInCell = [imCell image];<br />if(!imageInCell){<br />//Télécharger l&#39;image<br />theValue = newImage;<br />}<br />else<br />theValue = imageInCell;<br />
    


    Allez encore merci Ali
Connectez-vous ou Inscrivez-vous pour répondre.