Ios Segues和viewDidLoad/viewDidUnload方法

Ios Segues和viewDidLoad/viewDidUnload方法,ios,memory-management,uistoryboard,uistoryboardsegue,Ios,Memory Management,Uistoryboard,Uistoryboardsegue,我正在制作一个简单的故事板应用程序,它有2个UIViewController,我正在使用modal segue在它们之间切换。每个UIViewController都有一个UI按钮,用于执行到另一个UIViewController的切换。在viewDidLoad方法中,我为每个UIViewController上的UIButton的外观设置动画。我正在使用交叉溶解模态序列 当我按下第一个UIViewController上的UIButton时,我导航到第二个UIViewController,并执行动画

我正在制作一个简单的故事板应用程序,它有2个UIViewController,我正在使用modal segue在它们之间切换。每个UIViewController都有一个UI按钮,用于执行到另一个UIViewController的切换。在viewDidLoad方法中,我为每个UIViewController上的UIButton的外观设置动画。我正在使用交叉溶解模态序列

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

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

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

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

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

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

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


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

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

我正在将IBAction中的segue连接到UIButton click。我编写了这段代码来执行模态segue

@try
{
    [self performSegueWithIdentifier:segueToPerform sender:self];
}
@catch (NSException *exception) 
{
    NSLog(@"Exception: %@", exception);
}
@finally
{
    [self viewDidUnload];
}
我在@finally block中手动调用了viewDidUnload,并检查了viewDidUnload是否在运行时被调用,是否被调用

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

此方法是否常规用于替代:

[self dismissViewControllerAnimated:YES completion:nil];
因为上面这一行将我返回到我导航到当前UIViewController的UIViewController,但这不符合我的需要,因为我需要执行从当前UIViewController到其他UIViewController的新分段(除了返回到我导航到当前UIViewController的UIViewController之外)


[编辑#2:完成]


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

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

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

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

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

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

还是ARC在幕后进行垃圾收集

ARC不是一个垃圾收集器,它是一个引用计数机制,由编译器自动执行。物体仍然在那里

您应该将代码更改为调用

[self dismissModalViewControllerAnimated:YES];

在第二个控制器中,我没有使用模式segue,而是使用模式segue返回到第一个控制器。

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


感谢您的回答@dasblinkenlight!有些事情现在对我来说更清楚了。如果我取消使用modal segue导航到的UIViewController,这是否意味着我将返回到从中导航到该控件的UIViewController?在我的(更复杂的)应用程序中,我可以使用模式segue从两个不同的UIViewController导航到某个UIViewController。当我到达目标UIViewController时,在该控制器中有2个UIButton,可以将我带回这2个UIViewController中的任何一个