• 通俗易懂的讲解iphone视图控制器的生命周期


    IOS 视图控制器的生命周期非常非常重要,所以我有必要写个文章来和大家一起探讨问题。

    今天在学习视图控制器的生命周期,也看了一下网上的一些资料,但总觉得不是那么好理解,首先我们来看一张图:

     

    先粗略讲一下: 

     

    看这段源码就可以理解上面的那句话.这句话的意思就是说,如果view不存在,就会触发loadView方法 

     

    这话的意思是说如果不用nib方式,就可以在子类中自定义视图树,但不要直接去调用loadview方法。 

    再下一步问,是否是自定义方法Custom Method?(也可以看成是自定义视图)如果是,就调用自定义方法,如果不是,就要再进一步询问,是否是StoryBoard 如果是就从StoryBoard加载(调用load From storyBoard),如果不是就直接创建一个empty View.

     

    上面这段代码只需要关心第一句就可以了,它的意思说,调用viewDidLoad方法后就view视图就加载完成了。 

    从上面这张图中我们可以看到调用viewDidLoad方法前View一直是nil,调用viewDidLoad方法后View才有值了。 

    总之一句话,调用了viewDidLoad方法后就创建了View这句话就这么简单。

    比较难理解的是loadview方法,这里面非常关键。这里需要重点说明。

    如果你不重写loadview方法,系统就会调用其父类的方法,这个不难理解.

    但如果你重写了这个方法,打比方,你不调用[super loadview] 应用程序界面就是黑的,因为你的view一直没有被创建。

    //
    //  MainViewController.m
    //  Controller
    //
    //  Created by king on 13-7-7.
    //
    
    #import "MainViewController.h"
    
    @interface MainViewController ()
    
    @end
    
    @implementation MainViewController
    
    -(id)init{
        self = [super init];
        if(self){
            //这里不要调用self.view
        }
        return self;
    }
    
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
            // Custom initialization
            //这里不要调用self.view
        }
        return self;
    }
    
    -(void)loadView{
        //这里你要么调用[super loadview]方法创建view
        // 要么你自己自定义view ,给view赋值
       // [super loadView];
        
        UIView *view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
                        view.backgroundColor = [UIColor yellowColor];
                        self.view = view;
                        [view release];
       NSLog(@"viiew %@",self.view);
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
       // NSLog(@"View %@",self.view);这里调用self.view方法要注意的事项,调用self.view方法的时候请确保view不是nil否则程序会引起错乱。
        
        
        
        // Do any additional setup after loading the view.
    }
    
    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end
  • 相关阅读:
    如何开发一个标准的云原生应用?
    手机号显示脱敏
    利用awk快速求和
    同表不支持update子查询的结果
    analysis_slow_query.sh
    tidb集群没有打labels标签
    测试磁盘的fio
    ON DUPLICATE KEY UPDATE
    清除Linux历史命令小脚本
    date_and_time
  • 原文地址:https://www.cnblogs.com/liuzenglong/p/3176975.html
Copyright © 2020-2023  润新知