iso loadview死循环分析
在手动创建UI(不用interface builder)的工程里面,重写init和loadview方法:
- (id)init
{
if( self = [super init])
{
NSLog(@"%s, %d", __FUNCTION__, __LINE__ );
}
return self;
}
//调用loadview去加载view
- (void)loadView
{
NSLog(@"%s, %d", __FUNCTION__, __LINE__ );
// [ super load view ]
UIView *view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
NSLog(@"%s, %d", __FUNCTION__, __LINE__ );
self.view.backgroundColor = [ UIColor blueColor ];
NSLog(@"%s, %d", __FUNCTION__, __LINE__ );
self.view = view;
}在上面代码中,先运行的肯定是init方法,然后再调用loadview方法,
当运行到:
self.view.backgroundColor = [ UIColor blueColor ];
这一句的时候,view其实还没加载完,于是又一次调用loadview,但是在loadview中运行到
这一句的时候又出现相同的结果,程序出现死循环。
代码改为:
- (id)init
{
if( self = [super init])
{
NSLog(@"%s, %d", __FUNCTION__, __LINE__ );
self.view.backgroundColor = [ UIColor blueColor ];
NSLog(@"%s, %d", __FUNCTION__, __LINE__ );
}
return self;
}
//调用loadview去加载view
- (void)loadView
{
NSLog(@"%s, %d", __FUNCTION__, __LINE__ );
// [ super load view ]
UIView *view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
NSLog(@"%s, %d", __FUNCTION__, __LINE__ );
self.view = view;
}在init中,运行到
self.view.backgroundColor = [ UIColor blueColor ];
这一句的时候,发现view没有加载,既是init 没有运行完,任然会调用loadview方法。
也就是说,当程序发现view没有加载,而又要对view进行操作的时候,就会自动调用loadview方法。

浙公网安备 33010602011771号