XCode:执行模态搜索时的内存泄漏

时间:2015-09-08 20:07:05

标签: ios objective-c memory-leaks uistoryboardsegue

当登录用户打开我的应用程序时,它们会从我的AppDelegate发送到主TabBarController,如下所示:

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!

内存使用情况保持不变。当用户再次进入聊天时,内存继续增加。我不是正确地解雇发送视图控制器吗?

2 个答案:

答案 0 :(得分:0)

这是因为您尝试执行segue只是为了回到原来的位置。您需要做的就是通过调用[self dismissViewControllerAnimated:YES completion:nil];来关闭当前的模态视图控制器。每当您向视图堆栈添加模态视图时,您希望调用此方法退出,除非您的意图是在模态顶部添加另一个视图。

答案 1 :(得分:0)

你正在做的事情不是“回来”,而是在你已经拥有的那个视频之上呈现上一个视图的副本。这就是为什么内存正在积累的原因,因为你只是在彼此之上堆叠越来越多的视图。假设您使用模态segue来显示聊天视图,请尝试调用:

[self dismissViewControllerAnimated:YES completion:nil];