6

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

内存管理如何与多个故事板一起工作?

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

我将多个故事板与 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];

}
4

3 回答 3

7

所以我们开始 =)

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

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

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

对于您的其他问题的参考,我尊重 SO 和互联网的其余部分:
SO
UIStoryboard best practice
Multiple Storyboards in iOS on SO

快乐的故事板。

于 2012-12-06T20:24:35.520 回答
4

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

于 2012-12-06T20:43:21.213 回答
1

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

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

import UIKit

extension UIStoryboard {

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

}

于 2017-10-30T04:24:17.930 回答