2009-08-24 4 views
1

Je courais le code suivant dans tableView: cellForRowAtIndexPath:Objectif C Fuites lors de la publication des objets avec UITableViewCell

File *file = [[File alloc] init]; 
file = [self.fileList objectAtIndex:row]; 
UIImage* theImage = file.fileIconImage; 

cell.imageView.image = theImage; 
cell.textLabel.text = file.fileName; 
cell.detailTextLabel.text = file.fileModificationDate; 
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

return cell; 

j'ai couru l'outil de fuite et a trouvé que l'objet fichier est une fuite parce que je ne suis pas le relâcher. Donc, j'ai ajouté la libération avant de retourner la cellule où je pensais qu'il était sûr (comme indiqué ci-dessous):

File *file = [[File alloc] init]; 
file = [self.fileList objectAtIndex:row]; 

UIImage* theImage = file.fileIconImage; 

cell.imageView.image = theImage; 
cell.textLabel.text = file.fileName; 
cell.detailTextLabel.text = file.fileModificationDate; 
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
[file release]; 

return cell; 

Maintenant, quand je lance l'application, il se bloque. Les UITableViewCells référencent-ils toujours l'objet fichier? Quelle est l'approche à utiliser ici pour s'assurer que je ne fuit pas la mémoire?

Répondre

6
File *file = [[File alloc] init]; 
file = [self.fileList objectAtIndex:row]; 

Eh bien, ici, vous êtes d'abord l'attribution d'un nouveau File et vous jetez le pointeur et apparemment obtenir un autre objet existant d'un tableau. C'est celui que vous libérez si vous appelez le release plus tard. Celui que vous appelez release à la fin n'est pas celui que vous avez attribué. Le pointeur sur le point nouvellement alloué est perdu et fuit ainsi.

Probablement, il se bloque car self.fileList contient un pointeur vers un objet déjà détruit par la suite.

Peut-être que vous vouliez dire juste écrire

File *file = [self.fileList objectAtIndex:row]; 
+0

Fair, n'a pas regardé ce petit, avait suggéré que le autorelease avec le alloc/init ... mais vous avez raison, il n'a pas besoin allouer/init l'objet fichier à tous! – h4xxr

1

Oui, la cellule continue de le référencer au moment où vous le relâchez, ce qui provoque le blocage de l'application.

Vous devez utiliser autorelease lorsque vous déclarez, comme suit:

File *file = [[[File alloc] init] autorelease]; 

Ensuite, ne pas appeler la partie [de sortie du fichier]. Dès qu'il n'est plus référencé (c'est-à-dire lorsque vous arrêtez d'utiliser la cellule), il sera auto-libéré au début de la prochaine boucle d'exécution.

Questions connexes