多个情节提要:我应该使用单例模式来缓存它们吗?

zzheng

我在我的应用程序中使用了多个情节提要,这被认为是一种很好的做法。例如,从我的FooViewControllerin Main.storyboard,当点击一个按钮时,我将跳转到BarViewControllerSecondary.storyboard编程方式定义的另一个按钮

故事板和视图控制器之间的转换是在单独的文件中实现的,例如Storyboards,如下所示:

// in Storyboards.m
@implementation Storyboards

+ (id)instantiateBarViewController {
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Secondary" bundle:nil];
    return [storyboard instantiateViewControllerWithIdentifier:@"BarViewController"];
}

@end

然后在中FooViewController,我这样做:

// in FooViewController.m
- (IBAction)someButtonTapped:(id)sender {
    BarViewController *controller = [Storyboards instantiateBarViewController];
    [self.navigationController pushViewController:controller animated:YES];
}

这样很好。但是我的问题是:

  1. 是否有必要缓存情节提要板实例,以便每次instantiateBarViewController调用时都不需要重新创建情节提要板?
  2. 如果是,我BarViewController应该缓存吗?

要缓存情节提要板(和视图控制器),我可以使用以下代码:

// in Storyboards.m
@implementation Storyboards

+ (id)instantiateBarViewController {
    static UIViewController *barViewController = nil;  // Shared view controller.
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        UIStoryboard *storyboard = [self secondaryStoryboard];
        barViewController = [storyboard instantiateViewControllerWithIdentifier:@"BarViewController"];
    });
    return barViewController;
}

+ (UIStoryboard *)secondaryStoryboard {
    static UIStoryboard *storyboard = nil;  // Shared storyboard.
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        storyboard = [UIStoryboard storyboardWithName:@"Secondary" bundle:nil];
    });
    return storyboard;
}

@end

谢谢!

约书亚·诺齐(Joshua Nozzi)

我会说“不要”。

像这样保留对资源的引用意味着您将东西塞进内存受限的设备的内存中,而永远不会放任它们走。不好的开发者!没有饼干!;-)

您有什么证据表明这比让系统管理从Xibs反复加载的缓存或垃圾资源更好(它确实如此)?我想说您的方法弊大于利。请记住,仅创建一个故事图板实例并不能直接转换为“每次都从文件系统加载它”。系统对此进行了相当智能的管理,因此无需通过维护从未发布的引用来使其短路。

如果您想解决一些性能问题,我强烈建议您使用Instruments来衡量性能并从那里开始。我严重怀疑这是情节提要/ xib加载问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

多个情节提要:我应该使用单例模式来缓存它们吗?

来自分类Dev

我应该对DAL和服务类使用单例吗?

来自分类Dev

我应该使用单例跟踪我的Google Analytic跟踪器实例吗?

来自分类Dev

我应该使用单例跟踪我的Google Analytic跟踪器实例吗?

来自分类Dev

我应该避免在golang中打包单例吗?

来自分类Dev

我应该将单例作为函数参数传递吗

来自分类Dev

我应该使用模式吗

来自分类Dev

使用单例模式

来自分类Dev

如果我使用情节提要中的“添加缺少的约束”选项来在情节提要中分配约束怎么办?

来自分类Dev

这是单例模式吗

来自分类Dev

Java单例应该使用静态变量吗?

来自分类Dev

应该使用单例PixelShader是最佳做法吗?

来自分类Dev

我应该为此使用缓存吗?

来自分类Dev

在多个情节提要场景中使用NSArrayController

来自分类Dev

Xcode 6使用多个情节提要

来自分类Dev

正确使用单例模式

来自分类Dev

我应该避免使用交互模式吗?

来自分类Dev

我可以使用情节提要板将UINavigationController的视图嵌入UIViewController内吗?

来自分类Dev

模块模式真的必须是单例吗?

来自分类Dev

这个单例模式线程安全吗?

来自分类Dev

我应该缓存gettext吗?

来自分类Dev

我应该通过子类化应用程序在 onCreate 中初始化单例吗?

来自分类Dev

我实施单例模式时出错

来自分类Dev

我应该使用 SSD 作为 Ubuntu Server 18.04 的缓存吗

来自分类Dev

我可以将psd转换为情节提要或uiViewController吗?

来自分类Dev

watchos2-我可以实现多个情节提要吗?

来自分类Dev

使用枚举版本单例模式时,修改单例类代码是扩展单例功能的唯一方法吗?

来自分类Dev

倾向于使用单例设计模式来获得数据库连接

来自分类Dev

如何使用单例设计模式来建立和关闭 JDBC 连接?

Related 相关文章

  1. 1

    多个情节提要:我应该使用单例模式来缓存它们吗?

  2. 2

    我应该对DAL和服务类使用单例吗?

  3. 3

    我应该使用单例跟踪我的Google Analytic跟踪器实例吗?

  4. 4

    我应该使用单例跟踪我的Google Analytic跟踪器实例吗?

  5. 5

    我应该避免在golang中打包单例吗?

  6. 6

    我应该将单例作为函数参数传递吗

  7. 7

    我应该使用模式吗

  8. 8

    使用单例模式

  9. 9

    如果我使用情节提要中的“添加缺少的约束”选项来在情节提要中分配约束怎么办?

  10. 10

    这是单例模式吗

  11. 11

    Java单例应该使用静态变量吗?

  12. 12

    应该使用单例PixelShader是最佳做法吗?

  13. 13

    我应该为此使用缓存吗?

  14. 14

    在多个情节提要场景中使用NSArrayController

  15. 15

    Xcode 6使用多个情节提要

  16. 16

    正确使用单例模式

  17. 17

    我应该避免使用交互模式吗?

  18. 18

    我可以使用情节提要板将UINavigationController的视图嵌入UIViewController内吗?

  19. 19

    模块模式真的必须是单例吗?

  20. 20

    这个单例模式线程安全吗?

  21. 21

    我应该缓存gettext吗?

  22. 22

    我应该通过子类化应用程序在 onCreate 中初始化单例吗?

  23. 23

    我实施单例模式时出错

  24. 24

    我应该使用 SSD 作为 Ubuntu Server 18.04 的缓存吗

  25. 25

    我可以将psd转换为情节提要或uiViewController吗?

  26. 26

    watchos2-我可以实现多个情节提要吗?

  27. 27

    使用枚举版本单例模式时,修改单例类代码是扩展单例功能的唯一方法吗?

  28. 28

    倾向于使用单例设计模式来获得数据库连接

  29. 29

    如何使用单例设计模式来建立和关闭 JDBC 连接?

热门标签

归档