У меня есть приложение на основе контроллера разделенного представления. В контроллере подробных представлений назовите его FirstViewController, когда пользователь нажимает кнопку, я обновляю контроллеры представления новым контроллером представления, называем его SecondViewContorller, как показано ниже:
- (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];
}
Внутри SecondViewController, в какой-то момент мы имеем:
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:
UIViewController <SubstitutableDetailViewController> *detailViewController = nil;
if (rowNo == 0) {
FirstViewController *newDetailViewController = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
detailViewController = newDetailViewController;
}
...
UINavigationController *nav = (UINavigationController *)[delegate.splitViewController.viewControllers objectAtIndex: 0];
// Update the split view controller's view controllers array.
NSArray *viewControllers = [[NSArray alloc] initWithObjects:nav, detailViewController, nil];
delegate.splitViewController.viewControllers = viewControllers;
[viewControllers release];
...
[detailViewController release];
Если я имитирую предупреждение памяти в этот момент времени (после повторного отображения FirstViewController), я получаю
-[UIView _invalidateSubviewCache]: message sent to deallocated instance ...
со следом стека
#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 -
[super didReceiveMemoryWarning];
Если внутри метода buttonPressed из SecondViewController я прокомментирую строку, где я освобождаю detailViewContorller, все работает нормально, но я теряю память. Если я оставлю эту строку такой, какая она есть, то в случае предупреждения памяти произойдет сбой приложения.
Что я могу сделать?
Спасибо,
Михай