美文网首页
控制器的声明周期

控制器的声明周期

作者: coder_hong | 来源:发表于2016-05-24 23:09 被阅读58次

    ViewController的初始化

    • 从Storyboards中加载的时候,会调用initWithCode,如果不存在则调用init。之后对里面的每个对象调用awakeFromNib方法
    // StoryBoard加载的控制器  会调用改方法
    - (instancetype)initWithCoder:(NSCoder *)aDecoder
    {
        if (self = [super initWithCoder:aDecoder]) {
    
        }
        return self;
    }
    // XIB 加载控制器调用该方法
    - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        if ([super initWithNibName:nibNameOrNil bundle:nibNameOrNil]) {
    
        }
        return self;
    }
    
    

    ViewController查找与其关联的view,其顺序是:

    • 先判断子类是否重写了loadView,如果有直接调用。之后调viewDidLoad完成View的加载。
    // 通常自定义View的时候使用
    - (void)loadView
    {
        self.view = [[UIImageView alloc] init];
    }
    
    • 如果是外部通过调用initWithNibName:bundle指定nib文件名的话,ViewController记载此nib来创建View。
    • 如果initWithNibName:bundle的name参数为nil,则ViewController会通过以下两个步骤找到与其关联的nib。

    ViewController的卸载View的步骤:

    • 系统发出内存警告或者ViewController本身调用导致didReceiveMemoryWarning被调用
    • 如果此时view没有被加入到任何视图树上,则调用viewWillUnload之后释放View
    • 调用viewDidUnload

    注意:

    • 如果viewController从创建到销毁期间都没有内存警告,那么这两个函数将始终不会被调用。
    • iOS6已将viewWillUnload和viewDidUnload废弃,原因是UIKit在内存警告的时候已经不会自动释放无用的视图。

    声明周期方法

    /**
     *  从nib载入视图 ,通常这一步不需要去干涉。除非你没有使用xib文件创建视图
     */
    - (void)loadView
    {
        [super loadView];
        XMGFunc;
    }
    /**
     *  1 init函数 初始化对象
     */
    - (instancetype)initWithCoder:(NSCoder *)aDecoder
    {
        if (self = [super initWithCoder:aDecoder]) {
            XMGFunc;
        }
        return self;
    }
    /**
     *  视图载入完成,可以进行自定义数据以及动态创建其他控件
     */
    - (void)viewDidLoad {
        [super viewDidLoad];
        XMGFunc;
        self.title = @"MainVC";
    }
    /**
     *  视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了,每次视图消失再出现都会再次调用,通常我们会利用这个方法,对即将显示的视图做进一步的设置。例如,我们可以利用这个方法来设置设备不同方向时该如何显示。在视图间切换时,并不会再次载入viewDidLoad方法,所以如果在调入视图时,需要对数据做更新,就只能在这个方法内实现了。
     */
    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
        XMGFunc;
    }
    /**
     *  视图已在屏幕上渲染完成,有时候,由于一些特殊的原因,我们不能在viewWillApper方法里,对视图进行更新。那么可以重写这个方法,在这里对正在显示的视图进行进一步的设置
     */
    - (void)viewDidAppear:(BOOL)animated
    {
        [super viewDidAppear:animated];
        XMGFunc;
    
    }
    /**
     *  完成对子视图布局
     */
    - (void)viewDidLayoutSubviews
    {
        [super viewDidLayoutSubviews];
        XMGFunc;
    
    }
    /**
     *  将要要对子视图进行布局
     */
    - (void)viewWillLayoutSubviews
    {
        [super viewWillLayoutSubviews];
        XMGFunc;
    
    }
    /**
     *  在loadView之前的工作放在这里
     */
    - (void)awakeFromNib
    {
        XMGFunc;
    }
    /**
     *  视图将被从屏幕上移除之前执行,在视图变换时,当前视图在即将被移除、或者被覆盖时,会调用这个方法进行一些善后的处理和设置。
     */
    - (void)viewWillDisappear:(BOOL)animated
    {
        [super viewWillDisappear:animated];
        XMGFunc;
    }
    /**
     *  视图已经被从屏幕上移除,用户看不到这个视图了,我们可以重写这个方法,对已经消失,或者被覆盖,或者已经隐藏了的视图做一些其他操作。
     
    
     */
    - (void)viewDidDisappear:(BOOL)animated
    {
        [super viewDidDisappear:animated];
    }
    /**
     *  当程序收到内存警告的时候,会调用每一个ViewController的didReceiveMemoryWarning方法,我们需要做出相应,释放程序中暂时不需要的资源;通常都会重写该方法,但记得重写的时候要调用super的该方法。
        iOS3.0 - iOS6.0期间,didReceiveMemoryWarning方法会判断当前ViewController的view是否显示在window上,如果没有显示在window上,则didReceiveMemoryWarning会自动将ViewController的view以及其所有子view全部销毁,然后调用View Controller的viewDidUnload方法。但是从iOS6.0开始,viewDidUnload和viewWillUnload这两个方法已被废除,收到low-memory时系统不会释放view,而只是释放controller的resource。
     */
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        XMGFunc;
        //当前iOS系统的版本号
        float ver = [[[UIDevice currentDevice] systemVersion] floatValue];
        if (ver >= 6.0f) {
            //判断视图是否被装载进内存,并且是否为当前视图
            if (self.isViewLoaded && !self.view.window) {
                //将self.view置为nil,确保调用该viewController时,loadView和viewDidLoad再次调用
                self.view = nil;//确保下次重新加载
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:控制器的声明周期

          本文链接:https://www.haomeiwen.com/subject/ziozrttx.html