zoukankan      html  css  js  c++  java
  • ios-UIViewController的生命周期

    理解:
    UIViewController在初始化给window的时候就会自动调用loadview方法,父类中这个方法的意思就是,是否有xib或者storybord来创建一个view,来赋值给视图控制器的属性view,没有的话就穿就一个新的空的view来赋值,,,,,这是调用父类的loadview
    
    我们还可以复写这个loadview,复写的时候就不用调用父类的loadview了,如果那样就没有意义了,我们新建一个自己的view来给控制器就可以了。
    
    
    其实最终目的就是,试图控制器初始化的时候必须初始化内部的view属性。


    其实触发loadview方法的是,只要控制器要用到视图的时候,并且此控制器没有view就会通过loadview来获得一个view,如果有的话,就不会触发loadview,,因为当出现内存警告的时候,会卸载掉不在主窗口的控制器的view,再次将这个控制器到主窗口的时候就需要view,就会触发loadview


    6.0以前出现内存警告的时候,会调用viewWillUnload,viewdidunload来卸载不在主窗口上的控制器的view
    6.0之后出现内存警告的时候,会调用didreceivememorywaining来达到相应的效果
    6.0之后是要我们自己写的
    -(void)didReceiveMemoryWarning{
    if([self.view window]==nil){//这个判断方法就是下面这个是否能拿到window的一种应用
         self.view=nil;      
        }
    }

    拿到window的2中方法
    1、[UIApplication shareApplication].keyWindow;//一定能返回window
    2、self.view.window//这是在试图控制器中,当这个视图控制器没有占用window的话是不能获得window的,相反的当这个试图控制器占用着这个window你就可以通过这个方法来获得window
    -(void)viewDidUnload{
        [super viewDidUnload];
        _uiview=nil;//_uiview是此控制器的一个强引用,是一个全局的,是此控制器的view的一个子视图
    }
    //当在6.0之前,出现内存警告的时候,并且此控制器没有在窗口上,此控制器的视图就会被卸载,并且也会用nil赋值,此时其内部的视图也会被释放,但是当其子视图是一个强引用(就是一个全局的变量),那么这个指针就会指向一个空的地方,就是所谓的野指针,就容易出bug,当然局部的变量就不存了,出了大括号就消失了,其实能加给别人做子视图,不过是别人又个subview的数组来装自己的子视图,释放的时候自己的数组自然野会释放,不会出现野指针,,,,所以总结的就是最后将强引用放空很重要。
    //貌似将一个_uiview=nil的时候,这个对象的引用计数器会-1;//所以创建的时候不能释放,这样就会造成多次释放的bug,比如
    所以上面的心得就错了,
    新的心得:所以全局的ui的时候在创建的时候不能释放,这样就会造成多次释放,比如:我们的宗旨是谁污染是释放,当一个全局的ui穿就的时候我们将其加给一个父视图,引用计数+1,再出现内存警告要释放这个父视图的时候此子视图又会-1,就被释放干净了,执行-(void)viewDidUnload的时候又去_uiview=nil再释放一次就会出现错误,因为我们是全局的可能会给多个视图作为子视图,所以我们就不再创建的时候就释放,最后按照上面的那个样子执行一次。

    我靠,先不管上面的心得..等有时间再看一次,觉得绿色的是正确的心得
     
    - (void)didReceiveMemoryWarning//这个是6.0之后调用的方法
    {
        [super didReceiveMemoryWarning];
        if (self.view.window==nil) {//此代码的意思就是这个view是否在窗口上,看是否需要释放
            self.view=nil;//6.0之前出现内存警告系统帮我们做了这句代码,6.0之后需要我们自己写
            _uiview=nil;//同理和上面6.0之前的一样,这里就是将其设置为空指针,防止野指针的出现罢了
        }
    }
    上面的心得先不管,其实作祟的是下面这段代码
    
    -(void)setBook:(Book)book{
    [_book release];//[nil release]有可能为空
    _book=[book retain];
    }
    //当内部调用Controller的init方法的时候会自动调用-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil方法,反之是不会调用init方法的,这是苹果内部的代码,估计就是在init里面调用了一下用初始化nib方法而已
    //同理,view初始化的时候如果用init它也会自动调用initWithFrame方法,反之也不会调用init方法
    这就是为什么在xcode6.0以前建立controler和view的子类的时候为什么都知复写initWithNibNameinitFrame方法了,因为不管你用哪种内部都自动调用了这个对应的方法,xcode6.1.1以后就将这2个对应的复写方法也给祛除了,以后得自己写了
    1.这里只记录一些学习笔记 2.这里只记录一些学习心得,如果心得方向有错,请留言 2.这里只记录一些日记(只为提升英语,暂时有点忙,等转行了开始写)
  • 相关阅读:
    Jmeter JAVA工程测试
    jsp页面img利用tomcat配置访问服务器绝对路径显示图片
    PostgreSQL模仿Oracle的instr函数
    linux清理内存命令
    Tomcat去除项目名称和端口号,直接使用ip地址访问项目的方法
    linux下重启oracle服务:监听器和实例
    RedHat Linux 9.0的安装+入门指南(图文并茂)
    linux命令详解之挂载光驱的方法
    jQuery download file
    fiddler
  • 原文地址:https://www.cnblogs.com/liyang31tg/p/3639375.html
Copyright © 2011-2022 走看看