UISplitViewController - Работа с предупреждениями памяти - PullRequest
2 голосов
/ 04 августа 2010

Я использую 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 в 'правильное место). Есть ли другие способы решить эту проблему?

...