如何正确替换视图控制器

时间:2014-05-21 08:54:34

标签: ios objective-c uiviewcontroller

我无法理解我做错了什么。我有2个不相关的视图控制器,我通过将视图控制器拖到屏幕上来创建storyboard。每个都在故事板中有自己的名称标识符,我用它们的名字替换它们。

问题是,在第一次替换之后,我得到了几十个与现实无关的内存警告,因为我的内存消耗大约是 59M 并保持这样。当我从A切换到B而不是回到A时,有时会因为“记忆湖”而崩溃(59M !!)。

替换视图控制器时我做错了什么?

- (IBAction)goMatrix:(id)sender
{
    UIViewController *mainV=[self.storyboard instantiateViewControllerWithIdentifier:@"MatrixView"];
    mainV.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentViewController:mainV animated:YES completion:^(void)
     {
         scroller.delegate=nil;
         scroller=nil;
         [imagesBuffer removeAllObjects];
         [scroller removeFromSuperview];
         [stripView removeFromSuperview];


     }];

}

我在这两个图片中都有一个滚动视图,我只是从超视图中移除,我只是无法理解我还能做些什么真的清理(尽管内存只是59M)

  • 我记忆力很高的唯一时刻就是当我更换它们时,它的134M只有1秒钟(!)

1 个答案:

答案 0 :(得分:1)

如果您的应用是单一视图结构(未嵌入UINavigationControllerUITabBarController),您可以使用:

// App Delegate
UIViewController *mainV=[self.storyboard instantiateViewControllerWithIdentifier:@"MatrixView"];
self.window.rootViewController = mainV;
[self.window makeKeyAndVisible];
stripView = nil;

如果使用ARC,旧视图控制器将自动从内存中删除。

如果您使用View Controller编写,则可以使用:

UIViewController *mainV=[self.storyboard instantiateViewControllerWithIdentifier:@"MatrixView"];
AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
delegate.window.rootViewController = mainV;
[delegate.window makeKeyAndVisible];
stripView = nil;