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];
当登录用户打开我的应用程序时,它们会从我的 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];