2015-09-08 4 views
0

Когда зарегистрированный пользователь открывает мое приложение, они направляются к главному TabBarController из моего AppDelegate, например, так:XCode: Утечка памяти при выполнении модального SEGUE

UITabBarController *tabBar = (UITabBarController *)self.window.rootViewController; 
tabBar.selectedIndex = 2; 
// (this is MainViewController in the tab bar) 

Теперь пользователь находится в MainViewController. Когда пользователь выбирает конкретный чат они хотели войти, они направляются в ChatViewController (не на TabBarController), например, так:

[self performSegueWithIdentifier:@"showChatSeg" sender:self]; 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 
    if([segue.destinationViewController isKindOfClass:ChatViewController.class]){ 
     ChatViewController *destinationViewController = (ChatViewController *)segue.destinationViewController; 

     if(self.createdDialog != nil){ 
      destinationViewController.dialog = self.createdDialog; 
      self.createdDialog = nil; 
     }else{ 
      QBChatDialog *dialog = [ChatService shared].dialogs[self.selectedChat]; 
      destinationViewController.dialog = dialog; 
     } 
    } 
} 

Когда это происходит, я вижу всплеск использования памяти, который имеет смысл. Тем не менее, когда пользователь покидает ChatViewController и вернуться к MainViewController, например, так:

- (IBAction)backButton:(id)sender { 
    [self performSegueWithIdentifier:@"fromChatToDashSeg" sender:nil]; 

// This is a storyboard segue back to the MainTabBarController 

} 

Я получаю следующее предупреждение:

Attempt to present <MainTabBarController: 0x17ef28d0> on <ChatViewController: 0x17d6c940> whose view is not in the window hierarchy! 

И использование памяти остается неизменным. И когда пользователь снова заходит в чат, память продолжает расти. Не отклоняю ли я диспетчеров отправки?

+1

Вы используете модальный сеанс для представления чата? Вместо того, чтобы использовать segue, чтобы вернуться. Попробуйте позвонить [self rejectViewControllerAnimated: YES complete: nil]; –

ответ

0

Что вы делаете, не идет «назад», а скорее вы представляете копию предыдущего представления поверх того, что у вас уже есть. Вот почему память накапливается, потому что вы просто сохраняете все больше и больше видов сверху друг друга. Предполагая, что вы используете модальный сеанс для представления своего чата, попробуйте позвонить:

[self dismissViewControllerAnimated:YES completion:nil]; 
+0

Используя это, я все равно получаю уведомление: попытайтесь представить в , чей вид не находится в иерархии окон! –

+0

И проблемы с памятью остаются. –

+0

Где вы определяете fromChatToDashSeg? Это в вашей раскадровке? Удалите segue только для того, чтобы убедиться, что он все равно не использует segue вместо правильного отклонения. –

0

Это потому, что вы пытаетесь выполнить сеанс, чтобы вернуться в исходное местоположение. Все, что вам нужно сделать, это отклонить текущий контроллер модального просмотра, вызвав [self dismissViewControllerAnimated:YES completion:nil];. Всякий раз, когда вы добавляете модальный вид в стек представления, вы хотите вызвать этот метод для выхода, если только вы не намерены добавить еще один вид поверх модального.