Освобождение детального контроллера вызывает проблемы с памятью - PullRequest
0 голосов
/ 26 января 2011

У меня есть приложение на основе контроллера разделенного представления. В контроллере подробных представлений назовите его 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, все работает нормально, но я теряю память. Если я оставлю эту строку такой, какая она есть, то в случае предупреждения памяти произойдет сбой приложения.

Что я могу сделать?

Спасибо, Михай

1 Ответ

0 голосов
/ 26 января 2011

Мне интересно ваш первый блок кодов, в котором вы выпускаете свой detailViewController вместо secondVC? Потому что ваш второй виртуальный канал не был выпущен в конце метода. Вам следует освободить detailViewController в методе dealloc вместо этого в SplitViewAppDelegate, поскольку он является частью корневых представлений разделенного представления.

Ура, надеюсь, это поможет.

...