2011-03-22 6 views
2

J'ai eu un problème de fuite de mem découvert avec le profilage dans xcode. Le problème c'est assez facile mais je ne peux pas comprendre comment le résoudre:libérant toutes les cellules dans tableview ios iphone

Considérons un uiviewcontroller avec 2 bouton et une tableview. button1 = charger les données JSON depuis le serveur et ajouter des cellules à tableview puis [tableview reloadData]

button2 = charger les données JSON d'un autre serveur et ajouter des cellules à tableview puis recharger.

ok le problème est:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
.... 
..... 
NSURL *url = [NSURL URLWithString:stringpath]; 
NSData *data = [NSData dataWithContentsOfURL:url]; 
UIImage *img; 
if(!data) img=[UIImage imageNamed:@"small.jpg"]; 
else img= [[UIImage alloc] initWithData:data]; 
cell.imageView.image = img; 

Ok maintenant, si je commence à passer avec 2 bouton à chaque fois que je passe je suis une fuite de UIImage, donc je pense que je dois « purge » (libération) toutes les cellules les données avant de recharger?

Thx

Répondre

2

Vous devez libérer l'objet img après la mise en cell.imageView.image. Je préfère autorelease sur la même ligne car cela me facilite le suivi.

UIImage *img; 
if(!data) img=[UIImage imageNamed:@"small.jpg"]; 
else img= [[[UIImage alloc] initWithData:data] autorelease]; 
cell.imageView.image = img; 

Comme mentionné dans une autre réponse, vous pouvez vous épargner la douleur par ne pas utiliser l'appel initWithData, mais au lieu imageWithData.

Les cellules prendront soin d'elles-mêmes.

1

La question ne libère pas img, plz ci-dessous utilisent

if (!data) 
{ 
    img = [UIImage imageNamed:@"small.jpg"]; 
    cell.imageView.image = img; 
} 
else 
{ 
    img = [[UIImage alloc] initWithData:data]; 
    cell.imageView.image = img; 
    [img release]; 
} 
+0

Vraiment thx maintenant pas de fuite pour moi :) –

1

Je remplacerais cette ligne:

else img= [[UIImage alloc] initWithData:data]; 

avec:

else img= [UIImage imageWithData:data]; 
0

Vous ne devez pas affecter mémoire pour UIImage. Vous pouvez effectuer l'implémentation ci-dessus comme suit:

NSData * data = [NSData dataWithContentsOfURL: url];
cell.imageView.image = [UIImage imageWithData: données];

Essayez ceci.

+0

Thx Stone .. Je viens de c/C++ et pour moi, il est plus facile de penser à pile et tas. Si vous allouez dans la pile, la pile sera effacée quand vous changez de contexte et pour tas toutes les nouvelles vous avez besoin d'une suppression. Pour l'instant, la gestion de la mémoire dans ios est encore un peu confuse. J'ai lu la gestion de la mémoire d'Apple, mais la règle "si vous vous libérez" n'est pas toujours vraie. Peut-être qu'un jour je m'arrêterai pour tomber dans l'erreur comme ceci. Thx à nouveau. –

+0

Après un peu de pratique et de lecture, vous vous sentirez certainement à l'aise avec ce concept. :) – Nitish

Questions connexes