zoukankan      html  css  js  c++  java
  • 控制器view的生命周期

    一、基本过程

    新建一个项目,系统默认的主控制器继承自UIViewController,把主控制器两个文件删掉。

    在storyboard中,默认的控制器是View Controller,而我们需要的是导航控制器,那么就把系统的给删掉,拖一个导航控制器进来,导航控制器中默认的第一个子控制器是一个tableview controller,这里不需要,把它删掉,重新拖三个View Controller到界面上进行连线,简单的设置就可以了。

              

    按钮连线,按住ctrl,右边界面选择push。

      

    完成基本设置后的界面如下:

    经过这么几步简单的设置,就可以实现一个简单的多页面切换。为开发提供了极大的方便,但storyboard也不是万能的,要注意在开发中,如果在最后一个页面添加一个按钮,让它直接跳转到上一个页面会出现问题。

    提示:storyboard能做的事情,使用代码都能做,但是代码能够做的事情,storyboard不一定能够做。

    通过拖拉控件即可完成简单的界面设置。

    下面这样的连线会出现问题:(从后面的控制器跳转到前面,只能通过代码来实现)

    产生问题的原因:(当点击返回的时候,不是先把第三个控制器移除栈顶,而是先创建TWO控制器,此时栈里有四个控制器,栈顶的为TWO).

    二、控制器的生命周期

    代码简单说明:

    复制代码
     1 @interface NJOneViewController ()
     2 
     3 @property (nonatomic, strong) NSArray *foods;
     4 @end
     5 
     6 @implementation NJOneViewController
     7 
     8 // 当控制器的view加载完毕就调用
     9 - (void)viewDidLoad
    10 {
    11     [super viewDidLoad];
    12     NSLog(@"1控制器的view加载完毕");
    13 }
    14 
    15 // 控制器的view即将显示的时候调用
    16 - (void)viewWillAppear:(BOOL)animated
    17 {
    18     [super viewWillAppear:YES];
    19     NSLog(@"1控制器的view即将显示");
    20 }
    21 
    22 // 控制器的view完全显示的时候调用
    23 - (void)viewDidAppear:(BOOL)animated
    24 {
    25     [super viewDidAppear:animated];
    26     NSLog(@"1控制器的view完全显示");
    27 }
    28 
    29 // 控制器的view即将消失的时候调用
    30 - (void)viewWillDisappear:(BOOL)animated
    31 {
    32     [super viewWillDisappear:animated];
    33     NSLog(@"1控制器的view即将消失");
    34 }
    35 // 控制器的view完全消失的时候调用
    36 - (void)viewDidDisappear:(BOOL)animated
    37 {
    38     [super viewDidDisappear:animated];
    39     NSLog(@"1控制器的view完全消失");
    40 }
    41 
    42 // 控制器的view即将销毁的时候调用
    43 - (void)viewWillUnload
    44 {
    45     [super viewWillUnload];
    46 }
    47 // 控制器的view完全销毁的时候调用
    48 - (void)viewDidUnload
    49 {
    50     [super viewDidUnload];
    51     // 清空不需要的属性
    52 //    [self.foods release];
    53     self.foods = nil;
    54 }
    55 
    56 //- (void)setFoods:(NSArray *)foods
    57 //{
    58 //    if (_foods != foods) {
    59 //        [foods release];
    60 //        _foods = [foods retain];
    61 //    }
    62 //}
    63 
    64 // 接收到内存警告的时候调用
    65 - (void)didReceiveMemoryWarning
    66 {
    67     [super didReceiveMemoryWarning];
    68 }
    69  /**/
    70 
    71 @end
    复制代码

    打印结果如下

    三个重要的方法:

    复制代码
    // 控制器的view即将销毁的时候调用
    - (void)viewWillUnload
    {
        [super viewWillUnload];
    }
    // 控制器的view完全销毁的时候调用
    - (void)viewDidUnload
    {
        [super viewDidUnload];
        // 清空不需要的属性
    //    [self.foods release];
        self.foods = nil;
    }
    
    // 接收到内存警告的时候调用
    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
    }
    复制代码

    补充:

    两个内存警告的区别(和代理中得比较):

    代理的内存警告:当application发生一些事情的时候(接收到内存警告的时候),会先通知它的代理,之后代理会通知它的window,window会通知它的根控制器,根控制器会通知它的子控制器。内存警告是由上往下一层一层往下传的(可以通过在两个地方打印输出验证)。

    需要了解它的父类是如何处理内存警告的。

    模拟内存警告:

    内存警告的处理示意图:

    控制器的view是否可以销毁?它怎么知道是否可以销毁呢?如何判断?它是判断这个view是否是在windows上面。

    当前one控制器在栈顶,one控制器对应的view显示在window上,如果此时发生内存警告,那么one因为在window上面,所以不会被销毁。

    若此时再来一个two控制器,它创建对应的twoview显示到window上,one对应的view移开了,此时如果发生内存警告,则此时oneview已经不再在window上显示,所以会被销毁。

    特别说明:outlet代表着属性,当控制器创建的时候,属性一般也是有值的,当调用了- (void)viewDidUnload方法以后,即控制器的view完全销毁了以后,所有的属性数据会清空。一般在ios5以前,还会在这个方法里面清空里面的所有属性。

    提示:所有的控制器的这些方法其实是一个循环。

     
  • 相关阅读:
    任何抛开业务谈大数据量的sql优化都是瞎扯
    关于优化for循环的注意的事项
    sql调优《二》
    页面加载通过javascript来修改控件属性
    。net内存优化
    oracle调优使用到相关sql
    oracle插入或更新某一个指定列来执行触发器
    webpack4基础入门操作(二)(讲解下webpack的配置内容)
    webpack4基础入门操作(一)
    关于一个WCF调用的服务端和客户端的配置信息集合
  • 原文地址:https://www.cnblogs.com/kongweiiwei/p/4657322.html
Copyright © 2011-2022 走看看