분할보기 컨트롤러 기반 앱이 있습니다.세부보기 컨트롤러를 해제하면 메모리 문제가 발생합니다.
- (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, 다 잘 작동하지만 메모리가 누출됩니다. 그 줄을 그대로두면 메모리 경고가 발생하면 앱이 다운됩니다.
어떻게해야합니까?
감사합니다, 미하이
답변 해 주셔서 감사합니다. detailViewController는 해당 메소드에 대해 로컬입니다. detailViewController = secondVC 라인 이후에 모두 동일한 SecondViewController 객체를 가리 키므로 detailViewController 또는 secondVC를 릴리스해도 아무런 차이가 없어야합니다. –
일반적으로 메모리 크래시는 보유 개수이므로 컨트롤러의 dealloc 메소드를 중단하고 NSLog를 사용하여 특정 객체의 보유 수를 확인하고 dealloc이 불필요하게 호출하지 않도록 할 수 있습니다. – Seyther
저는 처음부터 두 번째 상세보기 컨트롤러로 갈 때와 같이 splitviewcontroller의 viewController를 업데이트하지 않기 때문에 문제가 제가 SecondViewController에서 FirstViewController로 돌아갈 방법이라고 생각합니다. –