博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ios-UIViewController的生命周期
阅读量:5794 次
发布时间:2019-06-18

本文共 2322 字,大约阅读时间需要 7 分钟。

理解: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的子类的时候为什么都知复写initWithNibName和initFrame方法了,因为不管你用哪种内部都自动调用了这个对应的方法,xcode6.1.1以后就将这2个对应的复写方法也给祛除了,以后得自己写了

 

转载于:https://www.cnblogs.com/liyang31tg/p/3639375.html

你可能感兴趣的文章
进阶开发——文档,缓存,ip限速
查看>>
vue中子组件需调用父组件通过异步获取的数据
查看>>
uva 11468 - Substring(AC自己主动机+概率)
查看>>
Mysql 数据备份与恢复,用户创建,授权
查看>>
Angular.js中的$injector服务
查看>>
构建之法读书笔记01
查看>>
linux - lsof 命令最佳实践
查看>>
kafka性能测试
查看>>
现实世界的Windows Azure:h.e.t软件使用Windows Azure削减50%的成本
查看>>
深入.net框架
查看>>
聚合类新闻client产品功能点详情分析
查看>>
js设置定时器
查看>>
数据库除运算
查看>>
LeetCode--112--路径总和
查看>>
DeviceIOControl与驱动层 - 缓冲区模式
查看>>
感悟贴2016-05-13
查看>>
vim使用教程
查看>>
跨vlan通信-----单臂路由技术
查看>>
百度编辑器ueditor 光标位置的坐标
查看>>
DEV-C++ 调试方法简明图文教程(转)
查看>>