我正在将我的应用程序移到故事板上,到目前为止,非常好。
但是,我发现了一些我不太懂的东西,让我担心。如果有人能对此提供一些见解,我将不胜感激。
我的应用使用普通的导航控制器。为了“向前”移动到新的视图控制器,我使用自定义segues;没有问题。但是,应用程序中有一点我要回到导航堆栈的开头。我还使用自定义segue配置了“导航”,为此,我通过将最后一个视图控制器拖到第一个(对我来说已经很奇怪)在Interface Builder中创建了segue,并且我实现了自定义segue按以下方式执行方法:
-(void)perform
{
UIViewController *src = (UIViewController *)self.sourceViewController;
UIViewController *dest = (UIViewController *)self.destinationViewController;
[src.navigationController popToRootViewControllerAnimated:NO];
// Custom animation code here
}
......效果很好。但是,我不明白为什么会这样。在我看来,自定义segue应该实例化我的第一个视图控制器的新实例并将其指定为“dest”,但看起来segue足够聪明,可以实现我想要导航到之前存在的实例查看Controller,而不是创建新实例,它将“dest”分配给现有实例。
有人知道以这种方式使用segues是否合适?它有可能是偶然的,但可能会在将来停止工作吗?我是不是在浪费内存,因为segue正在实例化一个我不打算使用的View Controller?
提前多多感谢!
答案 0 :(得分:2)
因为segue正在实例化View,我是否会浪费内存 控制器我不会用?
DestinationController
属性。自己测试:在你的根控制器中添加一个静态计数器,每次初始化这个类时都会增加它,并在你的视图中显示它:每次你使用这个技巧弹出到root时,你会看到它会增加。
有人知道以这种方式使用segues是否合适?
此问题至少有一个解决方案:在DestinationController
实施中释放segue的(void)perform
。这真的很快实现,但有点丑,因为你每次都分配并立即释放你的视图控制器......即使它比泄漏更好,也不是我称之为好的做法!
在我看来,实现你想要的更好的方法是不使用segue进行转换,只是使用按钮或其他任何东西,并在触摸此按钮时调用popToRootViewController:animated
。
它是否有可能是偶然的,但可能会停止工作 将来