viewDidLoad与initWithNibName的调用时机

加载一个ViewController,我们通常使用init或者initWithNibName方法初始化,但是有的时候会出现一些需要初始化的值没有得到正确的设置,下面给出代码看下实际的效果。

第一种情况:正常初始化

FatherViewController:
-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if(self){
        NSLog(@"F_init start ");
        self.FPContent = @"F_我是父类初始化的";
        NSLog(@"F_init end");
    }
    return self;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"F_View");
    NSLog(@"父类的属性值:%@",self.FPContent);
}

SubViewController:
-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if(self){
        NSLog(@"S_init start");
        self.FPContent = @"S_我是子类初始化的";
        NSLog(@"S_init end");
    }
    return self;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"S_View");
    NSLog(@"属性值:%@",self.FPContent);
}

执行结果输出如下:

2018-02-06 16:13:07.236401+0800 YYDemo[70368:2809851] F_init start
2018-02-06 16:13:07.236593+0800 YYDemo[70368:2809851] F_init end
2018-02-06 16:13:07.236878+0800 YYDemo[70368:2809851] S_init start
2018-02-06 16:13:07.236967+0800 YYDemo[70368:2809851] S_init end
2018-02-06 16:13:07.411284+0800 YYDemo[70368:2809851] F_View
2018-02-06 16:13:07.411469+0800 YYDemo[70368:2809851] 父类的属性值:S_我是子类初始化的
2018-02-06 16:13:07.411604+0800 YYDemo[70368:2809851] S_View
2018-02-06 16:13:07.411700+0800 YYDemo[70368:2809851] 属性值:S_我是子类初始化的

 

第二种情况:在initWithNibName中调用了viewDidLoad

FatherViewController:
-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if(self){
        NSLog(@"F_init start ");
        self.FPContent = @"F_我是父类初始化的";
        NSLog(@"F_init end");
    }
    return self;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"F_View");
    NSLog(@"父类的属性值:%@",self.FPContent);
}

SubViewController:
-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if(self){
        NSLog(@"S_init start");
        UILabel *la = [[UILabel alloc] initWithFrame:CGRectMake(88, 20, 100, 20)];
        la.text = self.FPContent;
        [self.view addSubview:la];
        self.FPContent = @"S_我是子类初始化的";
        NSLog(@"S_init end");
    }
    return self;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"S_View");
    NSLog(@"属性值:%@",self.FPContent);
}    

执行结果输出如下:

2018-02-06 16:19:37.594282+0800 YYDemo[71147:2825509] F_init start
2018-02-06 16:19:37.594492+0800 YYDemo[71147:2825509] F_init end
2018-02-06 16:19:37.594592+0800 YYDemo[71147:2825509] S_init start
2018-02-06 16:19:37.718493+0800 YYDemo[71147:2825509] F_View
2018-02-06 16:19:37.718672+0800 YYDemo[71147:2825509] 父类的属性值:F_我是父类初始化的
2018-02-06 16:19:37.718773+0800 YYDemo[71147:2825509] S_View
2018-02-06 16:19:37.718869+0800 YYDemo[71147:2825509] 属性值:F_我是父类初始化的
2018-02-06 16:19:37.719246+0800 YYDemo[71147:2825509] S_init end

 

由以上执行结果可知:

在初始化方法总调用View属性的时候就会调用viewDidLoad方法。

viewDidLoad方法一般在视图树构建完成以后调用一次,但是如果VC的View属性被引用,View为nil 的时候也会调用viewDidLoad方法,提前调动该方法可能就会导致某些值不能得到正确的初始化。

 

转载于:https://www.cnblogs.com/yinyanlyy/p/8422971.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值