viewcontroller市场生命周期函数公式的重要函数有哪些

View和viewController的生命周期View
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
View和viewController的生命周期
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口UIViewController的生命周期 - 简书
下载简书移动应用
写了6330字,被0人关注,获得了2个喜欢
UIViewController的生命周期
UIViewController是IOS程序中的一个重要组成部分,扮演者一个大管家的身份,管理着程序中的众多视图:何时加载view,加载的原则是什么,视图何时消失等问题,文档中讲的都很详细。Controller的view最好在需要显示时再去加载,并且在系统发出内存警告时释放不必要的view及相关的可再生的数据对象。一、UIViewController的初始化初始化时会根据需要调用init,initWithCoder等相关函数,这个时候我们可以 做一下简单的初始化操作,建立ViewController中需要使用的数据模型等,不建议在初始化阶段就直接创建view及其他与显示有关的对象(应该 放到loadView的时候去创建,或者采用懒加载的方法创建)。我们都知道ViewController可以通过代码和xib两种方式创建,这两种方式的初始化流程也不尽相同。1)使用xib创建的VCxib其实最终是会把我们的设置保存成一个数据集(xml文件), 当需要初始化构建VC的时候,回去读取记录的数据集,然后帮我们动态的创建VC,因此可以想象它在初始化时会先去找看是否实现initWithCoder 方法,如果该类实现了该方法,就直接调用initWithCoder方法创建对象,如果没有实现的话就调用init方法。调用完初始化方法以后紧接着会调 用awakeFromNib方法,在这个方法里面我们可以做进一步的初始化操作。2)使用代码创建VC使用代码创建时,我们根据需要手动的创建VC中的数据,如果自己定制VC时,还需要在init中调用[super init]。二、UIViewController中View的load和unload前面讲了不建议在VC初始化的时候就创建view及其他与显示相关的代码,官方文档建议将 View的初始化操作放到loadView的时候再做,当VC接到内存告警时会调用didRecieveMemoryWarning这个时候我们就要做出 响应,释放暂时不需要的对象。如果无视这个警告,系统内存不够用时会会继续发送,如果还得不到处理就会强制退出程序。下面看具体的loadView和 unloadView时候都会做什么操作。1)Load周期load cycle当需要显示或者访问view属性时,view没有创建的话,VC就会调用loadView方 法,在这个时候会创建一个view并将其赋给VC.view属性。紧接着就会调用VC的viewDidLoad方法,这个时候VC.view保证是有值 的,可以做进一步的初始化操作,例如添加一些subview。注意:定制VC时,如果覆盖loadView方法,不需要调用[super loadView]方法。2)Unload周期当app收到内存警告的时候,会调用每一个VC的didRecieveMemoryWarning方法,我们需要做出响应,释放程序中暂时不需要的资源。通常都会重写该方法,重写时候需要调用super的该方法。如果检测到当前VC的view可以被安全释放的话,就会调用viewWillUnload方法,这个我们必须要重视,因为当VC的view消失时候它的subviews可能会被一起释放,我们需要根据具体情况做一些记录,以保证下次能够正确创建,同时不出现内存泄漏。调用viewWillUnload以后,会将VC.view属性设置成nil,然后在调用viewDidUnload方法,这个时候我们可以释放那些强引用的对象。三 、ViewController的生命周期View是指Controller的View。它作为Controler的属性,生命周期在Controller的生命周期内。就是说你的Controller不能在view释放前就释放了。viewController的生命周期图UIViewController的生命周期需要说明的是:当你alloc并init了一个ViewController时,这个ViewController应该是还没有创建view的。 ViewController的view是使用了lazyInit方式创建,就是说你调用的view属性的getter:[self view]。在getter里会先判断view是否创建,如果没有创建,那么会调用loadView来创建view。loadView完成时会继续调用 viewDidLoad。loadView和viewDidLoad的一个区别就是:loadView时还没有view。而viewDidLoad时 view以及创建好了。四、当一个视图控制器被创建,并在屏幕上显示的时候。 代码的执行顺序1、 alloc
创建对象,分配空间2、init
初始化对象,初始化数据3、loadView
从nib载入视图 ,通常这一步不需要去干涉。除非你没有使用xib文件创建视图4、viewDidLoad
载入完成,可以进行自定义数据以及动态创建其他控件5、viewWillAppear
视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了6、viewDidAppear
视图已在屏幕上渲染完成当一个视图被移除屏幕并且销毁的时候的执行顺序,这个顺序差不多和上面的相反1、viewWillDisappear
视图将被从屏幕上移除之前执行2、viewDidDisappear
视图已经被从屏幕上移除,用户看不到这个视图了3、dealloc
视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放关 于viewDidUnload :在发生内存警告的时候如果本视图不是当前屏幕上正在显示的视图的话, viewDidUnload将会被执行,本所有子视图将被销毁,以释放内存。 因此当这个视图再次显示在屏幕上的时候,viewDidLoad 再次被调用,以构造视图。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:&&&& &&&&&&
&& &&&&&&&&&&&&
版权所有 鲁ICP备号-4
打开技术之扣,分享程序人生!当前位置: →
→ viewController生命周期
viewController生命周期
& 作者及来源: 景树园 - 博客园 &
&收藏到→_→:
摘要: viewController 生命周期
"viewController生命周期"::
一、viewcontroller的职责
对内管理与之关联的view,对外跟其他viewcontroller通信和协调。对于与之关联的view,viewcontroller总是在需要的时候才加载视图,并在不需要的时候卸载视图,所以也同时担当了管理应用资源的责任
二、viewcontroller的
view是指controller的view。它作为controler的属性,在controller的内。就是说你的controller不能在view释放前就释放了。
&&&&&&&&&&&&&&&&&&&&&viewcontroller的图
&&&需要说明的是:当你alloc并init了一个viewcontroller时,这个viewcontroller应该是还没有创建view的。viewcontroller的view是使用了lazyinit方式创建,就是说你调用的view属性的getter:[self view]。在getter里会先判断view是否创建,如果没有创建,那么会调用loadview来创建view。loadview完成时会继续调用viewdidload。loadview和viewdidload的一个区别就是:loadview时还没有view。而viewdidload时view以及创建好了。
三、view的加载过程
&&&文字说明在表述流程的时候总是很费力的,我又找到了如下的两张图
&&&&&&&&&&&&&&&&&&&&&&view加载过程图
跟随如下文字理解viewcontroller对view加载过程:
1 先判断子类是否重写了loadview,如果有直接调用。之后调viewdidload完成view的加载。
2 如果是外部通过调用initwithnibname:bundle指定nib文件名的话,viewcontroller记载此nib来创建view。
3 如果initwithnibname:bundle的name参数为nil,则viewcontroller会通过以下两个步骤找到与其关联的nib。
a 如果类名包含controller,例如viewcontroller的类名是myviewcontroller,则查找是否存在myview.nib;
b 找跟viewcontroller类名一样的文件,例如myviewcontroller,则查找是否存在myviewcontroller.nib。
4 &如果子类没有重写的loadview,则viewcontroller会从stroyboards中找或者调用其默认的loadview,默认的loadview返回一个空白的uiview对象。
注意第一步,viewcontroller是判断子类是否重写了loadview,而不是判断调用子类的loadview之后viewcontroller的view是否为空。就是说,如果子类重写了loadview的话,不管子类在loadview里面能否获取到view,viewcontroller都会直接调viewdidload完成view的加载。
&&&&&&&&&&&&&&&&&&&view卸载过程图
跟随以下文字理解卸载过程:
1 系统发出警告或者viewcontroller本身调用导致didreceivememorywarning被调用
2 调用viewwillunload之后释放view
3 调用viewdidunload
四、模拟器的调用顺序
我构架了此文来自: 马开东博客
转载请注明出处 网址:
这样一个环境,在该环境中有两个viewcontroller,姑且命名为a和b,tag分别为1和2,a控制程序启动的时候即加载的界面,在a中放一个按钮,按下后会通过segue来调用到界面b;b 中页放一个按钮,通过执行
[self dismissmodalviewcontrolleranimated:yes];
来返回界面a
然后检测所有的函数调用,依次如下
加载a的时候依次调用
1 initwithcoder
1 loadview //如果说你进行了重写,会在这里调用,这一步可以参考下文
1 viewdidload
1 viewwillappear
1 viewwilllayoutsubviews
1 viewdidlayoutsubviews
1 viewdidappear
切换至b的时候依次调用
2 initwithcoder &&&&&&&&&&&&//先将2初始化
1 prepareforsegue &&&&&&//调用1的准备过度的函数,所以在该函数中可以对界面b的一些相关属性进行赋值
2 loadview &&&//如果这里进行了重写
2 viewdidload &&&&&&&&&&&&&//2界面加载
1 viewwilldisappear
2 viewwillappear
2 viewwilllayoutsubviews
2 viewdidlayoutsubviews
2 viewdidappear
1 viewdiddisappear
从b切换回a的时候依次调用
2 viewwilldisappear
1 viewwillappear
1 viewdidappear
2 viewdiddisappear
顺序总结下来加载依次为:加载 & 显示 & 布局
完成顺序依次为:完成布局 & 完成显示 &- 完成加载
小注:-(void)函数如果重写,下面是一个可能的demo
-(void)loadview
&&&cgrect applicationframe = [[uiscreenmainscreen] applicationframe];
&&&uiview *contentview = [[uiviewalloc] initwithframe:applicationframe];
&&&contentview.backgroundcolor = [uicolordarkgraycolor];
&&&self.view =
&&&uilabel *lab = [[uilabelalloc]initwithframe:cgrectmake(100, 100, 100, 100)];
&&&lab.text = @"helloworld";
&&&[self.viewaddsubview:lab];
loadview虽然返回值为空,但必须在内对self.view进行赋值,否则会在建立该界面的时候收到如下的log信息:
application windows are expected to have a root view controller at the end of application launch
具体执行顺序为:代码执行了initwithcoder之后直接调用了三次loadview函数,并且没有调用其它函数(包括viewdidload 、viewwilldisappear、viewwilllayoutsubviews)
暂不清楚为什么会调用三此文来自: 马开东博客
转载请注明出处 网址:
次,我的猜测是:上述三个函数分别检测了一遍view是否存在,发现不存在,所以各自调用了一遍viewload,最后发现依然不存在,所以上述三个函数分别返回了失败,加载完成
但矛盾的地方是:为什么上述三个函数本身没有执行到?底层到底做了什么?
五、view和viewcontroller的创建阶段,关于什么时候应该干什么
allocating critical data structures required by your view controller
不要出现创建view的代码。良好的设计,在init里应该只有相关数据的初始化,而且这些数据都是比较关键的数据。init里不要掉self.view,否则会导致viewcontroller创建view。(因为view是lazyinit的)。
2、loadview
creating your view objects
只初始化view,一般用于创建比较关键的view如tableviewcontroller的tabview,uinavigationcontroller的navgationbar,不可掉用view的getter(在掉super loadview前),最好也不要初始化一些非关键的view。如果你是从nib文件中创建的viewcontroller在这里一定要首先调用super的loadview方法,但建议不要重载这个方法。
3、viewdidload
allocating or loading data to be displayed in your view
这时候view已经有了,最适合创建一些附加的view和控件了。有一点需要注意的是,viewdidload会调用多次(viewcontroller可能多次载入view,参见图2)。
4、viewwillappear 这个一般在view被添加到superview之前,切换动画之前调用。在这里可以进行一些显示前的处理。比如键盘弹出,一些特殊的过程动画(比如状态条和navigationbar颜色)。
5、viewdidappear 一般用于显示后,在切换动画后,如果有需要的操作,可以在这里加入相关代码。
6、viewdidunload
releasing references to view objects
releasing data that is not needed when your view is not displayed
这时候viewcontroller的view已经是nil了。由于这一般发生在内存警告时,所以在这里你应该将那些不在显示的view释放了。比如你在viewcontroller的view上加了一个label,而且这个label是viewcontroller的属性,那么你要把这个属性设置成nil,以免占用不必要的内存,而这个label在viewdidload时会重新创建。
7、dealloc
releasing critical data structures required by your view controller
六、几点备注:
1、按结构可以对ios的所有viewcontroller分成两类:
1)、主要用于展示内容的viewcontroller,这种viewcontroller主要用于为用户展示内容,并与用户交互,如uitableviewcontroller,uiviewcontroller。
2)、用于控制和显示其他viewcontroller的viewcontroller。这种viewcontroller一般都是一个viewcontroller的容器。如uinavigationcontroller,uitabbarcontroller。它们都有一个属性:viewcontrollers。其中uinavigationcontroller表示一种stack式结构,push一个viewcontroller或pop一次,因此后一个viewcontroller一般会依赖前一个viewcontroller。而uitabbarcontroller表示一个array结构,各个viewcontroller是并列的。
第一种viewcontroller会经常被继承,用来显示不同的数据给用户。而第二种很少被继承,除非你真的需要自定义它。
2、当view被添加其他view中之前时,会调用viewwillappear,而之后会调用viewdidappear。
当view从其他view中移出之前时,会调用viewwilldisappear,而之后会调用viewdiddisappear。
当view不在使用,而搜索此文相关文章:此文来自: 马开东博客
网址: 站长QQ
viewController生命周期_博客园相关文章
博客园_总排行榜
博客园_最新
博客园_月排行榜
博客园_周排行榜
博客园_日排行榜}

我要回帖

更多关于 生命周期函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信