XCode:执行模态转场时内存泄漏

XCode: Memory Leak When Performing Modal Segue

当登录用户打开我的应用程序时,它们会从我的 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 和 return 留给 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!

并且内存使用保持不变。而当用户再次进入聊天时,内存继续增加。我没有正确关闭发送视图控制器吗?

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

您正在做的不是 "back",而是您在现有视图之上展示先前视图的副本。这就是为什么记忆在增加,因为你只是不断地在彼此之上堆叠越来越多的视图。假设您正在使用模态转场来呈现您的聊天视图,请尝试调用:

[self dismissViewControllerAnimated:YES completion:nil];