ios - 多个 Storyboard : should I use a singleton pattern to cache them?

标签 ios objective-c cocoa-touch storyboard

我在我的应用中使用了多个 Storyboard,这被认为是一种很好的做法。例如,从 Main.storyboard 中的 FooViewController 中,当点击一个按钮时,我将跳转到 中定义的另一个 BarViewController Secondary.storyboard 以编程方式。

Storyboard和 View Controller 之间的转换是在单独的文件中实现的,例如 Storyboard,如下所示:

// 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. 是否有必要缓存 Storyboard实例,以便每次调用 instantiateBarViewController 时,我都不需要重新创建 Storyboard?
  2. 如果是,我是否也应该缓存 BarViewController

要缓存 Storyboard(和 View Controller ),我可以使用如下代码:

// 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

谢谢!

最佳答案

我会说“不要”。

像这样保持对资源的引用意味着您将东西塞进内存受限设备的内存中,并且永远不会让它们离开。 糟糕的开发者!没有 cookie! ;-)

您有什么证据表明这比让系统管理缓存或丢弃重复从 xibs 加载的资源(它确实如此)更好?我会说你的方法可能弊大于利。请记住,简单地创建 Storyboard实例并不能直接转化为“每次都从文件系统加载它”。系统对此进行了相当智能的管理,因此无需通过维护永远不会释放的引用来使其短路。

如果您正在尝试解决一些性能问题,我强烈建议您使用 Instruments 来衡量性能并从那里着手。我严重怀疑这是 Storyboard/xib 加载问题。

关于ios - 多个 Storyboard : should I use a singleton pattern to cache them?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29693848/

相关文章:

ios - 一半屏幕无法点击

ios - 如何在 UITableView 的顶部添加额外的分隔符?

objective-c - 实例化时使用代码更改 Storyboard中的自定义类

ios - 当滚动到屏幕外时,UITableView 部分无法正确绘制/EXC_Bad_Access

ios - 如何以编程方式将 UIView 添加到 Swift 中的 UIScrollView?

ios - 在 objective-c 中翻转缩放和旋转的 uiview

ios - 如何添加设备开关位置服务的Observer

objective-c - UISearchBar\UISearchDisplayViewController 的问题

objective-c - 当设备方向改变时改变 View Controller

ios - 本地化自然格式的 API 数据列表