2010-01-22 5 views
2

J'utilise le datamodel pour stocker 2 objets: Vidéo, Images. La vidéo contient uniquement des attributs de chaîne et les images ont deux attributs "Données binaires".release NSData dans NSManagedObject

Au début, les 2 attributs de données binaires se trouvaient dans l'objet vidéo. Mais toutes les vidéos sont en cours de chargement lors de l'initialisation de UITableView. Pour 400 vidéos, les données binaires représentent 20 Mo, alors imaginez avec 4000 vidéos ...

Désormais, avec 2 objets, le chargement UITableView fonctionne bien. -je charger des données binaires quand il est nécessaire dans la méthode: tableView: cellForRowAtIndexPath

Mais maintenant, plus je défiler dans la liste, plus la mémoire grandir regard :(

à ma méthode:

- (UITableViewCell *)tableView:(UITableView *)myTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"videoCell"; 
    Video *theVideo = (Video *)[[self fetchedResultsController] objectAtIndexPath:indexPath]; 
    VideoCellViewController *cell = (VideoCellViewController *)[myTableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     [[NSBundle mainBundle] loadNibNamed:@"VideoCellView" owner:self options:nil]; 
     cell = editingTableViewCell; 
     self.editingTableViewCell = nil; 
    } 
    cell.video = theVideo; 
    return cell; 
} 

Et la méthode setvideo dans VideoCellViewController

- (void)setVideo:(Video *)newVideo { 
    if (newVideo != video) { 
     [video release]; 
     video = [newVideo retain]; 
    } 
    NSData *imageData = [video.allImages valueForKey:@"thumbnailImage"]; 
    UIImage *uiImage = [[UIImage alloc] initWithData:imageData]; 
    smallImage.image = uiImage; 
    nameLabel.text = video.displayName; 
    [uiImage release]; 
} 

Même sans mettre le SmallImage, j'ai du mal de mémoire. Si je charge l'objet image, il ne sortira jamais.

J'essaye beaucoup de solution pour libérer la mémoire sans succes ... (didTurnIntoFault, release, CFRelease ...) Dans l'outil de représentation, je peux voir mes données binaires comme CFData. J'utilise beaucoup d'exemple iPhoneCoreDataRecipes et PhotoLocations.

je besoin d'aide pour nettoyer ma mémoire;)

Merci

Samuel

+0

D'où provient 'editingTableViewCell'? – slf

Répondre

1

De toute évidence il y a quelque chose qui se passe avec votre table logique de création de cellules. Jetons un coup d'oeil à un gestionnaire délégué cellForRow typique premier ..

static NSString *MyIdentifier = @"MyIdentifier"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease]; 
} 
// do stuff with cell 
return cell; 

Ici, nous voyons que nous sommes

  • essayant d'obtenir une cellule réutilisable
  • en cas d'échec (néant) créer un nouveau et passer l'ID réutilisable au cteur
  • puis faire des choses avec la cellule (nouvelle ou existante) et le retourner

Si vous ne saisissez pas la cellule pour la réutiliser dans la vue de table, vous obtiendrez toujours une cellule «nulle» renvoyée par la dequeue, d'où la nécessité de créer de nouvelles cellules à chaque fois. Cela entraînera une augmentation continue de la mémoire au fur et à mesure que vous faites défiler la liste, mais resterez à plat lorsque vous ne l'utilisez pas.

EDIT:

supposant que votre cellulaire est très bien, alors vous devez limiter si ce sont les données vidéo ou les données d'image qui fuit. Qu'est-ce que smallImage? Et es-tu sûr que tu ne veux pas tout faire seulement quand la vidéo est nouvelle?

- (void)setVideo:(Video *)newVideo { 
    if (newVideo != video) { 
     [video release]; 
     video = [newVideo retain]; 
     NSData *imageData = [video.allImages valueForKey:@"thumbnailImage"]; 
     UIImage *uiImage = [[UIImage alloc] initWithData:imageData]; 
     smallImage.image = uiImage; 
     nameLabel.text = video.displayName; 
     [uiImage release]; 
    } 
} 
+0

La réutilisation des cellules fonctionne bien dans mon projet (je définis cellIdentifier dans le fichier nib). Avec log je n'ai vu que 8 cellules de création. Je pense vraiment que c'est un problème avec la libération de données binaires. – Samuel

+0

ajouté suggestion alternative – slf

+0

Merci pour l'aide;) smallImage est un UIImageView définir dans la plume. Mais même sans set smallImage j'ai un problème de mémoire :(Juste le valueForKey fait des problèmes, il ne sortira jamais après ... Peut-être que je dois dire au NSManagedObjectContext de supprimer l'objet en mémoire pour l'instant – Samuel