【问题标题】:Memory management - How to show an already instantiated ViewController without creating a new instance内存管理 - 如何在不创建新实例的情况下显示已经实例化的 ViewController
【发布时间】:2013-07-20 14:10:39
【问题描述】:

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

所以应用程序加载并实例化 FirstViewController。您单击一个实例化FilterViewController 的按钮。从这里返回 FirstViewController 时,我正在创建一个 new 实例,如下所示:

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

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

    fvc.modalTransitionStyle = UIModalTransitionStyleCoverVertical;

然后重复这个过程。有什么方法可以在不重新实例化的情况下呈现视图控制器?我即将提交应用程序(希望明天),所以我需要尝试对此进行排序。谢谢!

这里是 ViewController 的介绍。

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

FirstViewController呈现FilterViewController

- (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];

}

【问题讨论】:

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


    【解决方案1】:

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

    如果你正在推入导航控制器,你会从导航控制器中弹出:[self.navigationController popViewControllerAnimated:YES];


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

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

    【讨论】:

    • 嘿,谢谢。所以我把这段代码放在[self dismissViewControllerAnimated:YES completion:^{ NSLog(@"test"); }]; 但是它不会返回或添加一个 NSLog。我去了我的FirstViewController,它有这条线:[self.navigationController pushViewController:self.filterViewController animated:NO]; 所以我应该尝试弹出它吗?
    • 试图弹出它,但它没有做任何事情,尝试popToRootViewControllerAnimated 也没有做任何事情
    • 您在过滤视图控制器的方法中添加了弹出代码?你能展示你如何创建和展示原始控制器的代码吗?
    • 用底部的编辑更新了我的 OP(是的,尝试了 pop 代码)
    • 哦,FilterViewController 是一个单独的 .xib,如果这有什么不同的话
    猜你喜欢
    • 2019-05-26
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 2018-09-12
    相关资源
    最近更新 更多