当前位置: 首页 > 知识库问答 >
问题:

Segues和viewDidLoad/viewDidUnload方法

石俊雄
2023-03-14

我正在制作具有2个UIViewController的简单故事板应用程序,我正在使用模态segue在它们之间切换。每个UIViewController都有一个UIButton,用于执行到另一个UIViewController的segue。在viewddLoad方法中,我在每个UIViewController上对该UIButton的外观进行动画处理。我使用交叉溶解模态segue。

当我按下第一个UIViewController上的UIButton时,我导航到第二个UIViewController,并执行动画,显示第二个UIViewController。在我按下第二个UIView控制器上的UIButton后,将显示第一个UIViewController,并执行其动画。一切看起来都很好,每次导航到UIViewController时,都会为其调用viewDidLoad方法。这太棒了。

我现在尝试将模态segue类型从交叉融合更改为XCode Interface Builder中默认提供的其他两种。我改为垂直覆盖,一切都很好,没有变化。但当我尝试翻转水平模态序列时,我发现了一个问题。

执行翻转水平模式分段时,将显示两个UIViewController上的“我的UIButton”,但不会执行动画。我尝试过调试,我确信动画命令正在执行,但动画没有显示。

所以这是我的第一个问题:有人知道这些模态序列之间有什么区别吗?这可能会导致我的动画没有显示出来?

其他问题与segue和内存管理的基本理论有关。当我执行segue并导航到某个UIViewController时,每次都会调用viewddLoad方法。那么,这是否意味着每次执行viewddLoad方法时我都会创建新的对象实例?

我还注意到,从未调用viewDidUnload方法。所以,如果前面问题的答案是肯定的(每个viewDidLoad执行都会创建新的对象实例),这是否意味着我的UIViewController对象实例永远不会被卸载和删除?还是ARC在幕后进行垃圾收集?

如果有人能解释故事板分段和内存管理/对象生命周期是如何工作的,以及为什么从来没有调用viewDidUnload方法,我将非常感激。

[编辑#1:在执行模式segue后尝试卸载UIViewController]

[更新#1:这不应该这样做,viewddUnload将被自动调用]

我正在制作附加到UIButton点击的IBAction中的segue。我编写了这段代码来执行模态segue。

@try
{
    [self performSegueWithIdentifier:segueToPerform sender:self];
}
@catch (NSException *exception) 
{
    NSLog(@"Exception: %@", exception);
}
@finally
{
    [self viewDidUnload];
}

我已经手动调用了viewddUnload在@最终块,我已经检查了天气viewddUnload是在运行时调用,是的-它被调用。

这是否意味着我成功地从另一个UIViewController卸载了使用模式segue导航到它时创建的UIViewController对象,并将其从内存中删除?

此方法是否常规替代:

[self dismissViewControllerAnimated:YES completion:nil];

因为上面这一行将我返回到导航到当前UIViewController的UIViewController,但这不符合我的需要,因为我需要执行从当前UIViewController到其他UIViewController的新分段(除了返回到导航到当前UIViewController的UIViewController之外)?

[编辑#2:完成]

最后,在为这些UIView创建单独的XIB文件后,我更改了实现模型,并在单个UIViewController下加载了新的UIView。我已经将@dasblinkenlight的答案标记为正确的答案,因为它包含了许多有用的信息,对该答案的讨论很好地回答了一些关于使用模态segues的疑问。

共有2个答案

毛成济
2023-03-14

我遇到了一个类似的问题,我有一个复杂的VC导航Web,结果使用segue(没有UINavigationController)占用了太多内存。您可能想看看这个问题/答案,看看我的最终解决方案。uerceg和dasblinkenlight之间的对话帮助我找到了这个解决方案。

从内存中分段并清除历史ViewController

徐昆
2023-03-14

我不知道你问题第一部分的答案,但一旦你知道了第二部分的答案,我相信你无论如何都会采取不同的解决方案。

每次都会调用viewDidLoad方法。所以,这是否意味着每次执行方法时,我都会创建新的对象实例?

绝对地“模态”segue使新视图完全遮挡旧视图,直到新视图关闭。如果来回多次,您的代码将在当前视图下累积一个完整的视图“堆栈”。

我还注意到,从未调用viewDidUnload方法。所以,如果前面问题的答案是肯定的(每个执行都会创建新的对象实例),这是否意味着我的UIViewController对象实例永远不会被卸载和删除?

这是正确的,您创建的所有视图控制器仍然存在,可以关闭其顶部的视图。

还是ARC在幕后做垃圾回收机制?

ARC不是垃圾收集器,它是一种引用计数机制,带有编译器的一点自动化。对象仍然存在。

您应该更改代码以调用

[self dismissModalViewControllerAnimated:YES];

在第二个控制器中,而不是使用将您带回第一个控制器的html" target="_blank">模式序列。

 类似资料:
  • 本文向大家介绍IOS 中loadView,viewDidLoad,viewDidUnload详解及使用,包括了IOS 中loadView,viewDidLoad,viewDidUnload详解及使用的使用技巧和注意事项,需要的朋友参考一下 loadView,viewDidLoad,viewDidUnload,这三个函数到底应该怎么用? 搜索一下,全是转载,大概内容是这样: loadView 手动加

  • 问题内容: 如果应用程序是第一次加载,我正在尝试执行segue。我可以在调试器中看到我的打印消息,但是Perform Segue无法正常工作。我没有任何错误。有人可以告诉我怎么了吗? 问题答案: 您不能在viewDidLoad()中使用performSegue()。将其移动到viewDidAppear()。 在viewDidLoad()时,当前视图甚至还没有附加到窗口,因此尚无法进行隔离。

  • 我正在遵循本教程 到目前为止,当我点击按钮时,它就可以工作了。然而,我似乎无法让它在viewDidLoad上显示中间广告。 这就是我所拥有的: 控制台不断向我显示: 2016-02-04 22:27:51.855 GoogleAdamObjutorial[3394:56415]要获取此设备上的测试广告,请致电:request。testDevices=@[kGADSimulatorID]; 单击按钮

  • 在应用程序启动时,我试图使用以下代码通过查看加载更改单独视图的位置: 但是,这似乎无法直接在viewDidLoad中工作。如果我使用iAction将to指定给按钮,代码就会工作 我猜我这里遗漏了什么,但我不知道是什么。

  • 本文向大家介绍ViewController 的 loadView, viewDidLoad, viewDidUnload 分别是在什么时候调用的?在自定义ViewController的时候这几个函数里面应该做什么工作?相关面试题,主要包含被问及ViewController 的 loadView, viewDidLoad, viewDidUnload 分别是在什么时候调用的?在自定义ViewCont

  • 当完成时,我有一个segue被5种不同的方法调用。我发现,如果我只调用一次segue(仅为一个设置动画),一切都可以正常工作,但通过调用多个,会出现以下错误: 完成块(所有动画相同) 因此,当所有五个动画都完成(并满足条件)时,它会调用segue 5次并创建错误(我非常确定,因为我做了很多测试) 我想要的是,当动画(并满足条件)完成时,可以毫无错误地过渡到。有什么帮助吗?