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

时间:2012-12-06 20:07:35

标签: iphone memory-management ios6 uistoryboard

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

内存管理如何与多个故事板配合使用?

  • 在启动storyboardA时,如果我返回另一个nib文件/转到另一个故事板,那个故事板A会留在内存中吗?
  • 我能够通过UIViewControllers获取导航控制器堆栈中视图数组的方式堆栈中故事板的“数组”吗?
  • 对于内存管理,我可以从内存中弹出或删除故事板吗?当我去另一个故事板时,我将它设置为零吗?

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

  • 我想要复杂的叙事故事板流程。将它们全部撞到一个地方是没有意义的。
  • 最终我将与许多不同的人合作,我发现团队工作的论据,版本控制足以引起选择多个故事板路线
  • 我正在混合NIB文件,因为故事板还不能用于复杂的nib文件,许多程序化视图等。

我的代码段

在InitialNibFile.m<中 - 从appdelegate启动。

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

}

3 个答案:

答案 0 :(得分:7)

所以我们去=)

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

我是否能够通过UIViewControllers获取导航控制器堆栈中的视图数组,从而获得堆栈中故事板的“数组”?
不,因为故事板彼此独立。但是,您可以通过迭代导航堆栈中的视图控制器来获取故事板。

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

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

快乐的故事板。

答案 1 :(得分:4)

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

答案 2 :(得分:1)

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

重要的是要意识到故事板在实例化后会在应用程序的生命周期内保存在内存中。如果这不是您想要的,那么您可以将静态常量属性转换为静态计算属性。创建故事板的扩展,同样可以应用于视图控制器,以便使应用程序内存清洁。

import UIKit

extension UIStoryboard {

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

}