访问视图控制器的view时候,如何view为nil,或者还没有加载完成就会调用
loadView
方法来创建view
没有重写loadView
方法时候,系统默认做的事情
1.如果初始化控制器的时候,有制定xib文件,就会根据xib文件的名字,进行加载xib文件
[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
2.如果在创建的时候,没有显示的传入xib的名字,那么系统就会找跟视图控制器名字一样的xib文件进行加载
[[ViewController alloc]init];
3.如果前面两步,都没有找到,那么系统就会自动创建一个空的view,来作为视图控制器的view
重写了loadView
方法时候
1.如果在
loadView
方法中没有给view进行赋值,那么在- (void)viewDidLoad
方法中使用view的时候,因为view为nil,所以就会再次来到loadView
方法中,这样就会造成了死循环,直到程序奔溃。
-(void)loadView{
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.view.backgroundColor = [UIColor redColor];
}
2.还有一种情况导致死循环,在
loadView
方法中,在没有把自定义的view赋值给视图控制器的view时候,就使用视图控制器的view,这个时候视图控制器的view的值还是空的,只要视图控制器的view的值为空,就会来到loadView
方法中,造成自身死循环,直到程序奔溃。
-(void)loadView{
UIView * view = [[UIView alloc]initWithFrame:[UIScreen mainScreen].bounds];
//这个解决自身死循环的方法是使用view.backgroundColor就没问题了,
self.view.backgroundColor = [UIColor yellowColor];
self.view = view;
}
正确的使用
如果重写视图控制器的view,就需要重写
loadView
方法,在使用视图控制器的view时候,必须确保必选有值,也就是必须控制器的view进行先赋值,再操作,不能使用[super loadView]
;方法,因为会重复上面系统的三个找xib文件的步骤。
-(void)loadView{
UIView * view = [[UIView alloc]initWithFrame:[UIScreen mainScreen].bounds];
self.view = view;
self.view.backgroundColor = [UIColor yellowColor];
}
网友评论