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方法。

posted @ 2013-07-01 19:57  he_qiao_2010  阅读(93)  评论(0)    收藏  举报