【问题标题】:Multiple Storyboards in iOS + Memory ManagementiOS + 内存管理中的多个故事板
【发布时间】:2012-11-24 22:57:23
【问题描述】:

我在我的 iOS6 / iOS6 应用程序中将多个故事板与 NIB 文件混合在一起。

内存管理如何与多个故事板一起使用?

  • 启动 storyboardA 后,如果我返回到另一个 nib 文件/转到另一个 storyboard,那个 storyboardA 会留在内存中吗?
  • 我能否像使用 UIViewControllers 获取导航控制器堆栈中的视图数组一样堆栈中的情节提要“数组”
  • 对于内存管理,我可以从内存中弹出或删除情节提要吗?当我转到另一个故事板时,是否将其设置为 nil?

我使用多个故事板与 nib 文件混合使用的原因:

  • 我想要复杂的叙事故事板流程。将它们全部放在一个地方是没有意义的。
  • 最终我将与许多不同的人一起工作,我发现团队合作、版本控制的论据足以让我选择多故事板路线
  • 我正在混合 NIB 文件,因为情节提要尚无法处理复杂的 nib 文件、许多编程视图等。

我的代码片段

InitialNibFile.m

- (IBAction)newStoryboardBtnPressed:(id)sender {

[self.view removeFromSuperview]; // here I remove this view from the superview to save memory
UIStoryboard *newStoryboard = [UIStoryboard storyboardWithName:@"NewStoryboard" bundle:nil];
UIViewController *initialSettingsVC = [newStoryboard instantiateInitialViewController];

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

 }

这里, 在故事板场景中的 UIViewController 视图中。

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

}

【问题讨论】:

    标签: iphone memory-management ios6 uistoryboard


    【解决方案1】:

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

    重要的是要意识到,一旦实例化,故事板就会在应用程序的整个生命周期内保存在内存中。如果这不是您想要的,那么您可以将静态常量属性转换为静态计算属性。创建情节提要的扩展,您可以为视图控制器应用同样的内容,以使您的应用程序内存干净。

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

    }

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢乔恩!我听从了建议,并计算了导航堆栈数组中视图控制器的数量。你现在说的很有道理!
      【解决方案3】:

      所以我们开始 =)

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

      我能否像使用 UIViewControllers 获取导航控制器堆栈中的视图数组一样在堆栈中获取故事板的“数组”?
      不,因为故事板是相互独立的。但是,您可以通过遍历导航堆栈中的视图控制器来获取故事板。

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

      对于您的其他问题的参考,我听从 SO 和互联网的其余部分:
      Best Practices for Storyboards on SO
      UIStoryboard best practices
      Multiple Storyboards in iOS on SO

      快乐的故事板。

      【讨论】:

      • 非常感谢 MishieMoo!这帮了大忙。
      • 如果有人回答您的问题,请确保接受答案 =)
      猜你喜欢
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      • 2012-03-08
      • 1970-01-01
      相关资源
      最近更新 更多