iOS5:与loadview以及init和实例变量混淆

son*_*nce 6 iphone xcode storyboard ios5

我是iOS5和故事板的新手.

我注意到如果我在viewcontroller .h文件中声明一个实例变量并在我的viewcontroller的.m文件的init中设置值,当显示viewcontroller的视图时,我的实例变量在viewDidLoad中显示null.为了让我获得myvariables,我需要在viewDidLoad中进行[self init].我的问题是:

@interface tableViewController : UITableViewController
{
NSMutableArray *myvariable;
}
@end

@implementation tableViewController
-(id)init
{
myvariable = [[NSMutableArray alloc]initWithObjects:@"Hi2",@"Yo2",@"whatsup2", nil];
}

- (void)viewDidLoad
{
NSLog(@"%@",myvariable); // DISPLAYS NULL
[super viewDidLoad];
}
Run Code Online (Sandbox Code Playgroud)
  1. 当我在.h和.m文件中声明并实现时,为什么我的变量在viewdidLoad中不可用?
  2. 如果是这种情况,viewDidLoad或viewWillAppear是为viewcontroller加载数据的常见位置吗?
  3. 即使在实例化viewcontroller并调用init函数时,viewDidLoad也不一定要显示变量.
  4. 哪里是为我的viewcontroller加载模型(数据)的正确位置/方法?

提前致谢

Fir*_*eer 14

所以要回答你的第一个问题,在这种情况下调用的初始化程序是initWithCoder :,而不是init.因此,如果您将NSArray初始化移动到initWithCoder:您应该发现它在视图加载之前可用.

不要忘记你也必须调用你的超类'初始化程序.所以像这样的模式会起作用:

-(id)initWithCoder:(NSCoder *)aDecoder {

    if ((self = [super initWithCoder:aDecoder])) {

        // initialize what you need here
    }

    return self;

}
Run Code Online (Sandbox Code Playgroud)

您还将在initWithCoder之后调用awakeFromNib :并且在所有插件已连接之后,如果您的初始化取决于正在填充的插座,那么就有机会在那里进行初始化.

然后你当然有viewDidLoadviewWillAppear : . 我不知道使用"正确"方法有一般性答案(问题2和4).这取决于您拥有多少数据,需要刷新的频率以及加载所需的时间.我的意见是,这是每个案件的决定.

对于问题#3,你有一个你在那里看到的例子吗?初始化程序肯定会在viewDidLoad之前调用.诀窍是知道正在调用哪个初始化程序.

请记住,viewDidLoad可能在视图控制器的生命周期内被多次调用.所以要做好准备.当然viewWillAppear:甚至更有可能在视图控制器的生命周期内被多次调用.

希望有所帮助.