内存管理 - 如何在不创建新实例的情况下显示已实例化的ViewController

时间:2013-07-21 22:09:42

标签: ios objective-c cocoa-touch memory-management

我遇到了重大的内存管理问题。在少量使用该程序后,它将崩溃内存不足。我终于找到了原因,每次创建新的ViewController而不是访问实例时,我都在创建一个新实例。

因此,app加载并实例化FirstViewController。单击实例化FilterViewController的按钮。从这里开始回到FirstViewController我正在创建一个实例,如下所示:

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName
        :@"MainStoryboard" bundle:nil];

    FirstViewController *fvc = [storyboard 
        instantiateViewControllerWithIdentifier:@"FirstViewController"];

    fvc.modalTransitionStyle = UIModalTransitionStyleCoverVertical;

重复过程。任何呈现视图控制器而不重新实例化的方法?我接近提交应用程序(明天希望)所以我需要尝试将其排序。谢谢!

以下是ViewController的演示文稿。

[self presentViewController:fvc animated:YES completion:nil];

FilterViewController

呈现FirstViewController
- (IBAction)searchOptions:(id)sender {
    FilterViewController *ctrl = [[FilterViewController alloc] init];
    [UIView transitionFromView:self.view toView:ctrl.view duration:1 options:UIViewAnimationOptionTransitionCurlUp completion:nil];

    self.filterViewController = ctrl;

    [self.navigationController pushViewController:self.filterViewController animated:NO];

}

1 个答案:

答案 0 :(得分:1)

如果您使用的是presentViewController,则可以通过调用[self dismissViewControllerAnimated:YES];返回上一个视图。您可以在当前正在创建新控制器的方法中执行此操作。

如果您要进入导航控制器,则会从导航控制器弹出:[self.navigationController popViewControllerAnimated:YES];


根据您的上次更新,您似乎没有导航控制器,只是将视图添加为子视图并存储过滤器视图控制器。这使得生活变得更加复杂,并且删除它的正确方法是设置委托关系,以便过滤器视图控制器在完成时回调到第一个视图控制器,然后第一个控制器转换视图并且nil是引用。

如果可以,请更改为正确使用导航控制器。您已经有一半的代码,但第一个视图控制器似乎不在导航控制器中。如果你使用导航控制器,生活将很容易......