2011-06-17 3 views
0

J'ai couru instrument dans xcode4 et il m'a dit qu'il y avait deux fuites dans le code suivant (noté ****). Je pensais que j'avais pris soin de la libération de la mémoire avec le code à pt. A et pt. B.Comment réparer cette fuite de mémoire autour de pushViewController?

J'ai lu quelques sujets connexes ici mais je n'arrivais toujours pas à comprendre pourquoi et comment les réparer.

Une autre question est de savoir si la libération à pt. A est nécessaire.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //Get the dialog id 
    NSDictionary *rowData = [dialogs objectAtIndex:indexPath.row]; 
    NSInteger dialogId = [[rowData objectForKey:@"id"] intValue]; 

    DialogViewController *detailViewController = [[DialogViewController alloc] initWithNibName:@"DialogViewController" bundle:nil]; 
    detailViewController.dialogId = dialogId; 
    NSString *title = [NSString stringWithFormat:@"%d. %@", [[rowData objectForKey:@"id"] intValue], [rowData objectForKey:@"title"]]; 
       ****** i  6.8% 
    [detailViewController.dialogTitle release];    // pt. A 
    detailViewController.dialogTitle = [title retain]; 

    [self.navigationController pushViewController:detailViewController animated:YES]; 
       ****** i 93.2% 
    [detailViewController release];       // pt. B 

} 

Merci beaucoup d'avance! Lu

Répondre

1

Que ce soit la libération/conserver les appels sont nécessaires au point A dépend sur la façon dont vous avez défini votre propriété dialogTitle. Si vous l'avez défini comme @property (retain), vous n'avez pas besoin de libérer l'ancienne valeur ou de conserver la nouvelle valeur car lorsque vous affectez une valeur à une propriété (retain), elle est automatiquement conservée. De même, lorsque vous attribuez une nouvelle valeur à une propriété (retain), l'ancienne valeur est libérée, vous n'avez donc pas besoin de la faire non plus. Tout ce que vous auriez besoin dans ce cas est la suivante:

detailViewController.dialogTitle = title; 

Si vous avez défini comme DialogTitle (cédez), alors vous avez besoin de faire de la libération/conserver au point A.

Quant au point B, vous avez besoin pour libérer parce que si vous ne le faites pas, votre objet detailViewController ne sera jamais supprimé. Quand il est alloué/initialisé, il obtient un nombre de retenue de 1. Lorsque vous appuyez sur le contrôleur de vue, il est conservé (il a donc maintenant un nombre de retenue de 2). Ensuite, vous relâchez à la fin de la méthode et son compte de retenue descend à 1. Ensuite, lorsque le contrôleur de navigation qui le contient est rejeté, il sera relâché, son compte de retenue passera à 0 et il sera supprimé. Au lieu de relâcher le detailViewController à la fin de la méthode, vous pouvez simplement le libérer lorsque vous l'allouez/init et supprimer la version à la fin de la méthode. En autoreleasing, vous êtes essentiellement en train de le marquer pour être libéré automatiquement la prochaine fois que le pool autorelease est effacé (ce qui sera peu après que cette méthode se termine)

+0

rekle, Merci pour votre réponse! Alors savez-vous pourquoi l'outil de fuite de Xcode4 signale une fuite de pt.B? Dois-je le considérer comme un faux négatif ou est-il possible que DialogViewController ait une fuite? Que suggérerais-tu? –

0

La ligne au-dessus du pushViewController doit être

detailViewController.dialogTitle = [[title retain] autorelease]; 

Cela devrait fonctionner aussi bien si dialagTitle est retain propriété

detailViewController.dialogTitle = title; 
Questions connexes