UIViewController生命周期遇到的问题

init-初始化程序;
viewDidLoad-加载视图;
viewWillAppear-UIViewController对象的视图即将加入窗口时调用;
viewDidApper-UIViewController对象的视图已经加入到窗口时调用;
viewWillDisappear-UIViewController对象的视图即将消失、被覆盖或是隐藏时调用;
viewDidDisappear-UIViewController对象的视图已经消失、被覆盖或是隐藏时调用;
viewVillUnload-当内存过低时,需要释放一些不需要使用的视图时,即将释放时调用;
viewDidUnload-当内存过低,释放一些不需要的视图时调用。

上面的内容是生命周期。今天遇到的问题如下:

RootViewController.m

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
_navigationView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, _viewWidth, _navgationBarHeight+_statusBarHeight)];
_navigationView.backgroundColor = [UIColor colorWithRed:190.0/255.0 green:0/255.0 blue:0/255.0 alpha:1];
DLog(@"RootViewController init 1");
[self.view addSubview:_navigationView];
DLog(@"RootViewController init 2");
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.

DLog(@"RootViewController viewDidLoad");
}

MyViweController.m

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
DLog(@"MyViweController init");
}
return self;
}

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.

DLog(@"MyViweController viewDidLoad");
}

MyViweController 是 继承自 RootViewController 的。

log打印的顺序如下

RootViewController  init 1
RootViewController viewDidLoad
MyViweController viewDidLoad
RootViewController init 2
MyViweController init

要知道:视图控制对象不会在创建的那一刻就马上创建相应的视图,而是等到需要使用的时候才通过调用loadView来创建,这样的做法能提高内存的使用率。

但是我上面的代码中,在 init 里面使用self.view时,就开始加载视图了。这就导致延迟载入机制失效了。

所以,我们在使用中,尽量不要在init相关的方法中调用viewController的相关视图。

参考:

_视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途