2010-03-25 2 views
0

Это в мой контроллер зренияМетод dealloc не вызывается в окне просмотра 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]; 
} 

Он находится в 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]; 
} 

ответ

1

этот метод не называется, я не знаю, почему , если он не звонил, я буду получаем память вопросы

Когда именно dealloc вызывается (т.е. когда объект освобождается) не должно действительно важно для вас. Важно то, что вы соединяете каждый alloc с release/autorelease. Которое вы, скорее всего, не делаете.

Приведенный выше код не очень хорошо читается и выглядит немного «Java» -ish. Ваш метод «get» фактически не возвращает ничего, что выглядит странно. Но вы обычно не называете метод «get___» в любом случае.

Вы, вероятно, утечка памяти в вашем getDoctorsListController метода на этой линии:

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

Поскольку вы не определили doctorListViewNavigationController в этом методе, и я предполагаю, что вы вывесили код, который компилируется, он либо член (хотя и не обязательно свойство) вашего класса или статической переменной где-нибудь. Это означает, что он уже может указывать на объект. Это означает, что когда вы назначаете новый объект alloc 'ed для него, старый потерян (просочился).

Вот как вы должны его реорганизовать.

- (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

Это, безусловно, не имеет доступа к собственности. Доступ к свойствам должен осуществляться через явные сообщения или точечный синтаксис. Вы не можете просто написать имя свойства и получить доступ к этому свойству. – Chuck

+0

@Chuck отредактирован, чтобы отразить вашу точку. Вероятно, это утечка на этой линии. –

+0

О, да, я согласен (я тот, кто его поддержал). Я просто не хочу, чтобы люди путались о том, как работают свойства. – Chuck

0

Там может быть много других объектов «позади сцены, которые хотят поддерживать DoctorListViewController. Если вы просто балансируете свои резервы и релизы, вы должны быть в порядке.

Также в -(void)doctorsListAction, не должно [doctorListViewController release]; быть [doctorListViewNavigationController release]; вместо этого?

Смежные вопросы