Я испытываю утечку памяти (UINavigationController и его корневой контроллер просмотра просачиваются) при представлении и увольнении UINavigationController в подвью. Мой метод представления навигационного контроллера кажется немного нестандартным, поэтому я надеялся, что кто-то из сообщества SO сможет помочь.Subview UINavigationController Leak ARC
1. Презентация
Навигационный контроллер представлен следующим образом:
-(void) presentSubNavigationControllerWithRootViewControllerIdentifier:(NSString *)rootViewControllerIdentifier inStoryboardWithName:(NSString *)storyboardName {
// grab the root view controller from a storyboard
UIStoryboard * storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
UIViewController * rootViewController = [storyboard instantiateViewControllerWithIdentifier:rootViewControllerIdentifier];
// instantiate the navigation controller
UINavigationController * nc = [[UINavigationController alloc] initWithRootViewController:rootViewController];
// perform some layout configuration that should be inconsequential to memory management (right?)
[nc setNavigationBarHidden:YES];
[nc setEdgesForExtendedLayout:UIRectEdgeLeft | UIRectEdgeRight | UIRectEdgeBottom];
nc.view.frame = _navControllerParentView.bounds;
// install the navigation controller (_navControllerParentView is a persisted IBOutlet)
[_navControllerParentView addSubview:nc.view];
// strong reference for easy access
[self setSubNavigationController:nc];
}
На данный момент, я ожидаю, что только «владелец» навигационного контроллера является контроллером Родительского представления (в данном случае self
). Однако, отклоняя контроллер навигации, как показано ниже, он не освобождается (и в результате также просачивается его rootViewController
и т. Д. Вниз по дереву владения).
2. Увольнение
Увольнение довольно просто, но это, кажется, не достаточно для надлежащего управления памятью:
-(void) dismissSubNavigationController {
// prevent an orphan view from remaining in the view hierarchy
[_subNavigationController.view removeFromSuperview];
// release our reference to the navigation controller
[self setSubNavigationController:nil];
}
Наверняка что-то еще «сохранить» контроллер навигации как она есть не освобождается. Я не думаю, что это может быть контроллер корневого представления, сохраняющий его, не так ли?
Некоторые исследования показали, что retainCount
не имеет смысла, но FWIW Я решил, что он остается в 2 после увольнения, где я ожидаю, что он будет равен нулю.
Есть ли совершенно другой/лучший способ представления subNavigationController? Возможно, определение контроллера навигации в раскадровке будет иметь большую выгоду, чем просто устранение необходимости в нескольких строках кода?
Спасибо, я ожидаю, что мой «танец вокруг» шаблона VC ребенка, вероятно, стал причиной возникновения этой проблемы. Скоро сделаем снимок в рефакторе. – dave