【发布时间】:2013-12-12 13:17:24
【问题描述】:
在 Master-Detail 应用程序中,我想显示一个包含 5 个部分的 TableView,标题为:
- 你的举动
- 他们的行动
- 赢得比赛
- 输掉的比赛
- 选项
所以我在 Xcode 5.0.2 中创建了一个空白的 Master-Detail 应用程序,然后在它的 MasterViewController.m(这是一个 UITableViewController)中尝试实现该方法:
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return _titles[section];
}
我的问题是如何初始化 NSArray _titles?
我正在 MasterViewController.m 中尝试:
#import "MasterViewController.h"
#import "DetailViewController.h"
static NSArray *_titles_1 = @[
@"Your Move",
@"Their Move",
@"Won Games",
@"Lost Games",
@"Options"
];
@interface MasterViewController () {
NSMutableArray *_games;
NSArray *_titles_2 = @[
@"Your Move",
@"Their Move",
@"Won Games",
@"Lost Games",
@"Options"
];
}
@end
@implementation MasterViewController
- (void)awakeFromNib
{
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
self.clearsSelectionOnViewWillAppear = NO;
self.preferredContentSize = CGSizeMake(320.0, 600.0);
}
[super awakeFromNib];
}
- (void)viewDidLoad
{
....
}
但上面的两次尝试都给我语法错误:
更新:
令我惊讶的是,对于这个简单的问题有很多建议,但作为 iOS/Objective-C 新手,我不确定哪种解决方案最合适。
dispatch_once - 在多线程应用程序中执行一次不是运行时操作吗?这里是不是太过分了?我期待一个用于启动 const 数组的编译时解决方案...
viewDidLoad - 当我的应用在后台和前台之间切换时,是否不需要一次又一次地启动我的 const 数组?
我不应该在awakeFromNib 中设置NSArray 更好吗(因为我的所有视图控制器都使用了stroyboard 场景)?或者可能在initSomething(是正确的方法initWithStyle?)
【问题讨论】:
-
在
viewDidLoad初始化它。 -
您应该将签名改为
static NSArray* const。有很多方法可以解决何时初始化数组,如下面的答案所示。我喜欢惰性初始化,但它并不适合这个用例。 -
您正在寻找的是(窒息!)单例式初始化。它不需要在自己的类中,但是,它可以是此类的一部分。
-
@AlexanderFarber iOS 应用程序是多线程的,并且类方法可以被多个线程并发调用,因此使用
dispatch_once或某种形式的锁定会更安全。我可以从第一手经验告诉你,否则崩溃错误的可能性是非常真实的。
标签: ios objective-c nsmutablearray initialization nsarray