0

マイビューコントローラーにあります

-(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];
}

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];
}
4

2 に答える 2

1

このメソッドは呼び出されません呼び出されない場合、メモリの問題が発生する理由がわかりません

正確deallocに呼び出されるタイミング(つまり、オブジェクトの割り当てが解除されるタイミング)は、実際には重要ではありません。alloc重要なのは、それぞれをrelease/とペアにすることですautorelease。あなたがしていない可能性が高いです。

上記のコードはあまりよく読めず、少し「Java」っぽく見えます。「get」メソッドは実際には何も返しませんが、これは奇妙に見えます。ただし、通常、メソッドに「get___」という名前を付けることはありません。

getDoctorsListControllerこの行のメソッドでメモリリークが発生している可能性があります。

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

このメソッドで定義しておらずdoctorListViewNavigationController、コンパイルするコードを投稿したと想定しているため、クラスのメンバー(必ずしもプロパティである必要はありません)または静的変数のいずれかです。つまり、すでにオブジェクトを指している可能性があります。つまり、新しいallocオブジェクトを割り当てると、古いオブジェクトは失われます(リークされます)。

リファクタリングする方法は次のとおりです。

- (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];
}
于 2010-03-26T00:10:25.697 に答える
0

DoctorListViewControllerを維持したい「舞台裏」の他のオブジェクトがたくさんあるかもしれません。保持と解放のバランスをとるだけであれば、大丈夫です。

また、では、代わり-(void)doctorsListActionにすべきではありません[doctorListViewController release];か?[doctorListViewNavigationController release];

于 2010-03-25T14:29:17.970 に答える