2010-03-25 5 views
0

Il est à mon avis contrôleurLa méthode dealloc n'est pas appelé dans la vue modale actuelle contrller

-(void)doctorsListAction 
{ 
    if(isFirst == YES) 
    { 
     [self getDoctorsListController]; 
     [[self navigationController] presentModalViewController:doctorListViewNavigationController animated:YES]; 
     [doctorListViewController release]; 
    }  
} 

-(void)getDoctorsListController 
{ 
    //DoctorListViewController *doctorListViewController=[[[DoctorListViewController alloc]initWithNibName:nil bundle:nil]autorelease]; 

    doctorListViewController=[[DoctorListViewController alloc]init]; 
    doctorListViewNavigationController=[[UINavigationController alloc]initWithRootViewController:doctorListViewController]; 
    doctorListViewController.doctorList=doctorList; 
    doctorListViewNavigationController.navigationBar.barStyle= UIBarStyleBlackOpaque; 
    [doctorListViewController release]; 
} 

Il est dans DoctorListViewContrller

-(void)closeAction 
{ 
    printf("\n hai i am in close action*******************************"); 
    //[doctorList release]; 
    //[myTableView release]; 
    //myTableView=nil; 

    printf("\n myTableView retainCount :%d",[myTableView retainCount]); 

    [[self navigationController] dismissModalViewControllerAnimated:YES]; 


} 
//this method is not called I don't know why if it not called i will get memory issues 

- (void)dealloc 
{ 
    printf("\n hai i am in dealloc of Doctor list view contrller"); 
    [doctorList release]; 
    [myTableView release]; 
    myTableView=nil; 
    [super dealloc]; 
} 

Répondre

1

cette méthode est appelée, je ne sais pas pourquoi si elle n'appelle i obtiendrai problèmes de mémoire

Quand exactement dealloc est appelé (lorsque l'objet est désalloué) ne doit pas vraiment important pour vous. Ce qui compte, c'est que vous associez chaque alloc avec un release/autorelease. Ce que vous ne faites probablement pas.

Le code ci-dessus ne lit pas très bien et ressemble un peu "Java" -ish. Votre méthode "get" ne retourne rien, ce qui semble étrange. Mais normalement vous ne nommez pas une méthode "get___" de toute façon.

Vous probablement une fuite mémoire dans votre méthode getDoctorsListController sur cette ligne:

doctorListViewNavigationController=[[UINavigationController alloc]initWithRootViewController:doctorListViewController]; 

Puisque vous n'avez pas défini doctorListViewNavigationController dans cette méthode, et je suppose que vous avez publié le code qui compile, il est soit un membre (bien que pas nécessairement une propriété) de votre classe ou une variable statique quelque part. Ce qui signifie qu'il pourrait déjà pointer vers un objet. Ce qui signifie que lorsque vous lui attribuez un nouvel objet alloc, l'ancien est perdu (fuite).

Voici comment vous devriez le refactoriser.

- (void)doctorsListAction 
{ 
    if (isFirst == YES) 
    { 
     [self showDoctorsList]; 
    }  
} 

- (void)showDoctorsList 
{ 
     DoctorListViewController* doctorListViewController = [[DoctorListViewController alloc] initWithNibName:nil bundle:nil]; 
     doctorListViewController.doctorList = doctorList; 
     UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:doctorListViewController]; 
     navController.navigationBar.barStyle = UIBarStyleBlackOpaque; 
     [self.navigationController presentModalViewController:navController animated:YES]; 
     [navController release]; 
     [doctorListViewController release]; 
} 
+0

Ce n'est certainement pas un accès à la propriété. Les accès aux propriétés doivent être effectués via des envois de messages explicites ou une syntaxe à points. Vous ne pouvez pas simplement écrire le nom d'une propriété et lui donner accès à la propriété. – Chuck

+0

@Chuck modifié pour refléter votre point. Encore probablement une fuite sur cette ligne. –

+0

Oh, ouais, je suis d'accord (je suis celui qui a upvoted). Je ne veux pas que les gens soient confus au sujet du fonctionnement des propriétés. – Chuck

0

Il pourrait y avoir beaucoup d'autres objets « derrière la des scènes qui veulent garder DoctorListViewController Si vous équilibrez simplement vos retenues et libérations, vous devriez aller bien.

Également dans -(void)doctorsListAction, ne devrait pas [doctorListViewController release]; être [doctorListViewNavigationController release]; à la place?