Iphone iOS+中的多个故事板;内存管理

Iphone iOS+中的多个故事板;内存管理,iphone,memory-management,ios6,uistoryboard,Iphone,Memory Management,Ios6,Uistoryboard,我在我的iOS6/iOS6应用程序中混合了多个故事板和NIB文件 内存管理如何处理多个故事板? 在启动故事板a时,如果我返回到另一个nib文件/转到另一个故事板,那么该故事板a是否只是停留在内存中 我是否能够像使用UIViewController获取导航控制器堆栈中的视图数组那样,获取堆栈中故事板的“数组” 对于内存管理,我可以从内存中弹出或删除情节提要吗?当我转到另一个故事板时,是否将其设置为零 我将多个故事板与nib文件混合使用的原因: 我想要复杂的故事情节板流程。把他们都扔到一个地方

我在我的iOS6/iOS6应用程序中混合了多个故事板和NIB文件

内存管理如何处理多个故事板?

  • 在启动故事板a时,如果我返回到另一个nib文件/转到另一个故事板,那么该故事板a是否只是停留在内存中
  • 我是否能够像使用UIViewController获取导航控制器堆栈中的视图数组那样,获取堆栈中故事板的“数组”
  • 对于内存管理,我可以从内存中弹出或删除情节提要吗?当我转到另一个故事板时,是否将其设置为零
我将多个故事板与nib文件混合使用的原因:

  • 我想要复杂的故事情节板流程。把他们都扔到一个地方是没有意义的
  • 最终,我将与许多不同的人一起工作,我发现团队合作、版本控制的理由足以让我选择多故事板路线
  • 我混合使用NIB文件是因为故事板还不能处理复杂的NIB文件、许多编程视图等
我的代码片段

在InitialNibFile.m中,我们开始=)

启动故事板a时,如果我返回到另一个nib文件/转到另一个故事板,该故事板a是否会留在内存中?
情节提要由您创建的UIViewController(通过
情节提要
)属性保留。所以是的,它会一直保存在内存中,直到它的所有视图控制器都被释放。查看(简介)

我是否能够像使用UIViewController获取导航控制器堆栈中的视图阵列那样获取堆栈中故事板的“阵列”?
不,因为故事板是相互独立的。但是,您可以通过迭代导航堆栈中的视图控制器来获取故事板

对于内存管理,我可以从内存中弹出或删除情节提要吗?当我转到另一个情节提要时,是否将其设置为零?
只要内存中有实例化的视图控制器,它就会一直存在。当您使用名为:的故事板时,自动删除的对象将返回给您。视图控制器将保留它,因此不必担心释放或设置为nil

关于您的其他问题,请参考SO和互联网的其他部分:



愉快的故事板。

听起来您在试图避免在内存中保留不必要的视图控制器。这是一件需要避免的事情,因为视图控制器很大,因为它们引用了很多其他对象。您的问题听起来好像您担心右舷引用了故事板中的所有视图控制器,因此也保留了所有视图控制器。事实并非如此。storyboard对象只是对应用程序包的resources目录中的文件的引用,每次要求它创建新的视图控制器时,它都会从这些资源中实例化一个新的视图控制器。例如,它可以从情节提要多次实例化同一模板视图控制器。在实例化任何实时视图控制器之后,它都不会保留这些控制器

听起来您好像在试图避免在内存中保留不必要的视图控制器

重要的是要认识到,一旦脚本被实例化,它将在应用程序的生命周期中一直保存在内存中。如果这不是您想要的,那么您可以将静态常量属性转换为静态计算属性。创建情节提要的扩展,这与您可以应用于视图控制器的内容相同,从而使应用程序内存干净

import UIKit

extension UIStoryboard {

static var main: UIStoryboard {
    return UIStoryboard(name: "Main", bundle: Bundle.main)
}

}

非常感谢MishieMoo!这帮了大忙。如果有人回答了你的问题,一定要接受答案=)谢谢Jon!我按照建议做了日志,计算了导航堆栈数组中视图控制器的数量。你现在说的有道理了!
- (IBAction)anotherStoryboardBtnPressed:(id)sender {

    // I'm inside a storyboard right now. I'm calling another storyboard. 
    // can i remove this storyboard before i launch the otherone? will keeping 2 or 3 toryboards in memory cause a memory leak?

    UIStoryboard *settingsStoryboard = [UIStoryboard storyboardWithName:@"AnotherStoryboard" bundle:nil];
    UIViewController *initialSettingsVC = [settingsStoryboard instantiateInitialViewController];
    // i'm going to load this view controller modally
    // initialSettingsVC.modalTransitionStyle=UIModalTransitionStyleFlipHorizontal;
    [self presentViewController:initialSettingsVC
                       animated:YES
                     completion:nil];

}
import UIKit

extension UIStoryboard {

static var main: UIStoryboard {
    return UIStoryboard(name: "Main", bundle: Bundle.main)
}