Я использую UISplitViewController, где при загрузке главного виртуального контейнера (UITableViewController) и нажатии ячейки таблицы создается подробный виртуальный контроллер (UIViewController с двумя UIWebViews):
@implementation MasterVC
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UIViewController *detailViewController = nil;
DetailVC *newDetailViewController = [[DetailVC alloc] initWithNibName:@"DetailVC" bundle:nil];
detailViewController = newDetailViewController;
// Update the split view controller's view controllers array.
NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, detailViewController, nil];
splitViewController.viewControllers = viewControllers;
[viewControllers release];
[detailViewController release];
}
Если я имитирую предупреждение о памяти, освобождается DetailVC (didReceiveMemoryWarning, viewDidUnload, dealloc), но я получаю сообщение об ошибке "- [UIView _invalidateSubviewCache]: сообщение отправлено в освобожденный экземпляр" в строке в MasterVC, где я освобождаю viewControllers, что имеет смысл, так как он пытается загрузить detailViewController (DetailVC), который был освобожден из-за предупреждения памяти. Почему он должен выпускать подробности vc, потому что это вид, который отображается, я не совсем понимаю.
Теперь, если вместо того, чтобы освобождать detailViewController внутри didSelectRowAtIndexPath, я выпускаю его внутри viewWillDisappear, все работает нормально:
@implementation MasterVC
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UIViewController *detailViewController = nil;
DetailVC *newDetailViewController = [[DetailVC alloc] initWithNibName:@"DetailVC" bundle:nil];
detailViewController = newDetailViewController;
// Update the split view controller's view controllers array.
NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, detailViewController, nil];
splitViewController.viewControllers = viewControllers;
[viewControllers release];
// Released in viewWillDissapear
//[detailViewController release];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
MyAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
// Retrieve the detail vc and release it-[UIView _invalidateSubviewCache]: message sent to deallocated instance
[[delegate.splitViewController.viewControllers objectAtIndex:1] release];
}
Для меня имеет смысл (в некоторой степени) выпустить контроллер подробного вида, когда главный контроллер вида исчезнет, но все же это выглядит как хак (плюс Статический анализатор жалуется на то, что не выпускает подробный vc в 'правильное место). Есть ли другие способы решить эту проблему?