程序,控制期和view的生命周期
Posted LoSenTrad
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序,控制期和view的生命周期相关的知识,希望对你有一定的参考价值。
// 如果控制器是窗口的根控制器就可以不用设置尺寸
// self.view = [[UIView alloc] initWithFrame:CGRectZero];
self.view = [[UIView alloc] initWithFrame:CGRectZero];
###一.UIApplication的生命周期
(其实是UIapplication代理的方法)
“`objc
// 应用加载完毕
- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions
NSLog(@"应用加载完毕");
return YES;
// 应用即将成为非活跃状态(即将失去焦点)
- (void)applicationWillResignActive:(UIApplication *)application
NSLog(@"即将失去焦点");
// 应用进入后台
- (void)applicationDidEnterBackground:(UIApplication *)application
NSLog(@”应用进入后台”);
// 应用即将进入前台
- (void)applicationWillEnterForeground:(UIApplication *)application
NSLog(@”应用即将进入前台”);
// 应用成为活跃状态(应用获取焦点)
- (void)applicationDidBecomeActive:(UIApplication *)application
NSLog(@”应用获取焦点”);
// 应用即将结束
- (void)applicationWillTerminate:(UIApplication *)application
NSLog(@”应用即将结束”);
// 应用内,双击home键结束,会调用此方法
// 应用外,双击home键结束,不会调用此方法
// 应用接收到内存警告
-(void)applicationDidReceiveMemoryWarning:(UIApplication *)application
NSLog(@”应用接收到内存警告”);
###二.控制器的生命周期(按执行循序排序)
```objc
//初始化对象,初始化数据的(一般很少在这个方法内执行操作)
- (instancetype)init
if([super init])
...
return self;
// 系统从xib中加载,重写了loadView,系统不会加载storyboard和xib!!
-(void)loadView
[super loadView];
// 视图加载完成
- (void)viewDidLoad
[super viewDidLoad];
NSLog(@"%@,加载完成",[self class]);
// 即将显示
-(void)viewWillAppear:(BOOL)animated
[super viewWillAppear:animated];
NSLog(@"%@,即将显示",[self class]);
//即将布局view
- (void)viewWillLayoutSubviews
[super viewWillLayoutSubviews];
NSLog(@"viewWillLayoutSubviews");
//已经布局好view
- (void)viewDidLayoutSubviews
[super viewDidLayoutSubviews];
NSLog(@"viewDidLayoutSubviews");
// 已经显示
-(void)viewDidAppear:(BOOL)animated
/*
系统在载入数据后,将会在屏幕上显示视图,这时候会先调用这个方法.通常我们会利用这个方法对即将显示的视图进一步的
设置,例如:我们可以利用这个方法设置设备不同方向时该如何显示.
另外,当app中有多个视图的时候,在视图切换的时候,并不会再次的调用ViewDidLoad方法,所以如果在调入视图时,
需要对数据做更新,就只能在这个方法内实现了,这个方法非常有用!
*/
[super viewDidAppear:animated];
NSLog(@"%@,已经显示",[self class]);
// 即将消失
-(void)viewWillDisappear:(BOOL)animated
[super viewWillDisappear:animated];
NSLog(@"%@,即将消失",[self class]);
// 已经消失
-(void)viewDidDisappear:(BOOL)animated
[super viewDidDisappear:animated];
NSLog(@"%@,已经消失",[self class]);
//内存警告
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
//即将销毁view
- (void)viewWillUnload
[super viewWillUnload];
NSLog(@"viewWillUnload");
//已经销毁view
- (void)viewDidUnload
/*
这个方法作用:
在内存足够的情况下,软件的视图通常会一直保存在内存中,但是如果内存不够的话,一些没有正在显示的ViewController
将会收到内存不够的警告,然后就会释放自己拥有的视图,已达到释放内存的目的,但是系统只会释放内存,并不会释放对
像的所有权,所以我们需要在这里将不需要在内存中保留的对象释放所有权,也就是讲其指针设置为nil,
这个方法通常并不会在试图变换的时候被调用的,而只会在系统退出或者是收到内存警告的时候才会被调用的,但是由于
我们需要保证收到内存警告的时候能够对其作出响应,所以我们手动自己去实现这个方法
另外,即时设备上按了Home键之后,系统也不一定调用该方法,因为在ios4之后,系统允许app在后台挂起,并将继续滞留在内存中,因此ViewController并不会调用这个方法释放内存
*/
[super viewDidUnload];
NSLog(@"viewDidUnload");
// 控制器销毁,这里可以对之前创建的对象进行释放
-(void)dealloc
NSLog(@"%@,销毁",[self class]);
```
###三view的生命周期
(自定义或者重写继承自UIview的控制的时候调用的)
``` //通过代码创建控件的时候的会调用,
//这里的获取frame值 是不准确的
//创建子控件对象添加即可,在layoutSubviews中布局
“`objc
//调用init的方法的时候,init方法内部会自动调用initWithFrame:方法
- (instancetype)initWithFrame:(CGRect)frame
if (self = [self initWithFrame:frame])
return self;
//通过xib和SB加载的会调用
//在这里获取frame的值也是不准确的
//这里获取不到UIView中子控件(这里还没加载完成)
//创建
- (instancetype)initWithCoder:(NSCoder *)aDecoder
if (self = [super initWithCoder:aDecoder])
return self;
//通过xib\\sb加载会调用
//这里获取的frame值还是假的
//创建子控件对象 ,添加即可 - 布局在layoutSubviews
- (void)awakeFromNib
//在这里可以绘制图层
- (void)drawRect:(CGRect)rect
//在这里布局子控间的
//第一次加载或者刷新的时候会调用
//子控件发生变化的时候(frame和子控件的个数变化),会调用
- (void)layoutSubviews
“`
以上是关于程序,控制期和view的生命周期的主要内容,如果未能解决你的问题,请参考以下文章
iOS小技能:导航控制器(控制器view的多种创建方式控制器的生命周期)