2011-01-26 4 views
0

분할보기 컨트롤러 기반 앱이 있습니다.세부보기 컨트롤러를 해제하면 메모리 문제가 발생합니다.

- (void) buttonPressed:(id)sender { 
    UIViewController <SubstitutableDetailViewController> *detailViewController = nil; 

    SecondViewController *secondVC = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil]; 
    ... 
    detailViewController = secondVC; 

    MyAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
    UINavigationController *nav = (UINavigationController *)[delegate.splitViewController.viewControllers objectAtIndex: 0]; 
    NSArray *viewControllers = [NSArray arrayWithObjects:nav, detailViewController, nil]; 
    self.splitViewController.viewControllers = viewControllers; 

... 

    [detailViewController release]; 

}

내부의 : 상세 뷰 컨트롤러에서 호출, 사용자가 버튼을 누를 때, 나는 새로운 뷰 컨트롤러와 뷰 컨트롤러를 업데이트, 그것을 SecondViewContorller, 다음과 같은 것을 FirstViewController 전화

MyAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
UINavigationController *nav = (UINavigationController *)[delegate.splitViewController.viewControllers objectAtIndex: 0]; 
NSArray *array = nav.viewControllers; 
// Retrieve the master view controller 
MasterViewController *masterVC = [array objectAtIndex:[array count] - 1]; 
[masterVC selectRowManually:[NSIndexPath indexPathForRow:0 inSection:0]]; 

을하고 selectRowManually 내부에 나는 다시 FirstViewController를 초기화 : SecondViewController, 어떤 점에서 우리는이

,814 내가합니다 (FirstViewController가 다시 표시 한 후) 메모리는이 시점에서 경고 시뮬레이션 경우 013,210

, 나는

#0  0x012dd057 in ___forwarding___ 
#1  0x012dcf22 in __forwarding_prep_0___ 
#2  0x00b49a55 in -[UIView dealloc] 
#3  0x00bbe52a in -[UIViewController setView:] 
#4  0x00bc0eec in -[UIViewController unloadViewForced:] 
#5  0x00bbcb0a in -[UIViewController unloadViewIfReloadable] 
#6  0x00bbc15b in -[UIViewController didReceiveMemoryWarning] 
#7  0x0006aec7 in -[SecondViewController didReceiveMemoryWarning] at SecondViewController.m:385 
... 

라인 (385)의 스택 추적과 함께

-[UIView _invalidateSubviewCache]: message sent to deallocated instance ... 

를 얻을 수 is

[super didReceiveMemoryWarning]; 

buttonView 방식의 SecondViewController 내부에서 내가 출시 한 행에 주석을 달았습니다. detailViewContorller, 다 잘 작동하지만 메모리가 누출됩니다. 그 줄을 그대로두면 메모리 경고가 발생하면 앱이 다운됩니다.

어떻게해야합니까?

감사합니다, 미하이

답변

0

내가 대신 secondVC 당신의 detailViewController을 해제 어디 코드의 첫 번째 블록에 대해 궁금 해요? 왜냐하면 당신의 secondVC가 메소드의 끝에서 공개되지 않았기 때문입니다. SplitViewAppDelegate는 splitview의 루트 뷰의 일부이므로 dealloc 메소드에서 detailViewController를 릴리스해야합니다.

환호, 도움이 되길 바랍니다.

+0

답변 해 주셔서 감사합니다. detailViewController는 해당 메소드에 대해 로컬입니다. detailViewController = secondVC 라인 이후에 모두 동일한 SecondViewController 객체를 가리 키므로 detailViewController 또는 secondVC를 릴리스해도 아무런 차이가 없어야합니다. –

+0

일반적으로 메모리 크래시는 보유 개수이므로 컨트롤러의 dealloc 메소드를 중단하고 NSLog를 사용하여 특정 객체의 보유 수를 확인하고 dealloc이 불필요하게 호출하지 않도록 할 수 있습니다. – Seyther

+0

저는 처음부터 두 번째 상세보기 컨트롤러로 갈 때와 같이 splitviewcontroller의 viewController를 업데이트하지 않기 때문에 문제가 제가 SecondViewController에서 FirstViewController로 돌아갈 방법이라고 생각합니다. –