我在我的应用程序中使用了多个情节提要,这被认为是一种很好的做法。例如,从我的FooViewController
in Main.storyboard
,当点击一个按钮时,我将跳转到BarViewController
以Secondary.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];
}
这样很好。但是我的问题是:
instantiateBarViewController
调用时都不需要重新创建情节提要板?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
谢谢!
我会说“不要”。
像这样保留对资源的引用意味着您将东西塞进内存受限的设备的内存中,而永远不会放任它们走。不好的开发者!没有饼干!;-)
您有什么证据表明这比让系统管理从Xibs反复加载的缓存或垃圾资源更好(它确实如此)?我想说您的方法弊大于利。请记住,仅创建一个故事图板实例并不能直接转换为“每次都从文件系统加载它”。系统对此进行了相当智能的管理,因此无需通过维护从未发布的引用来使其短路。
如果您想解决一些性能问题,我强烈建议您使用Instruments来衡量性能并从那里开始。我严重怀疑这是情节提要/ xib加载问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句