iOS:捋一遍View的生命周期
一、介绍
前面介绍了VC的生命周期,闲着没事也来捋一捋View的生命周期,简单用两个类型的View来监测。一个View纯代码创建,另一个View使用Xib创建。

二 、代码
MyCodeView:
//
// MyCodeView.m
// 生命周期
//
// Created by 夏远全 on 2019/11/3.
// Copyright © 2019 Beijing Huayue Education Technology Co., Ltd. All rights reserved.
// #import "MyCodeView.h" @implementation MyCodeView - (instancetype)initWithFrame:(CGRect)frame {
NSLog(@"myCodeView-------%s",__func__);
return [super initWithFrame:frame];
} - (nullable instancetype)initWithCoder:(NSCoder *)coder {
NSLog(@"myCodeView-------%s",__func__);
return [super initWithCoder:coder];
} -(void)awakeFromNib {
NSLog(@"myCodeView-------%s",__func__);
return [super awakeFromNib];
} -(instancetype)init {
NSLog(@"myCodeView-------%s",__func__);
return [super init];
} - (void)willMoveToSuperview:(nullable UIView *)newSuperview {
NSLog(@"myCodeView-------%s",__func__);
[super willMoveToSuperview:newSuperview];
} - (void)didMoveToSuperview {
NSLog(@"myCodeView-------%s",__func__);
[super didMoveToSuperview];
} - (void)willMoveToWindow:(nullable UIWindow *)newWindow {
NSLog(@"myCodeView-------%s",__func__);
[super willMoveToWindow:newWindow];
} - (void)didMoveToWindow {
NSLog(@"myCodeView-------%s",__func__);
[super didMoveToWindow];
} - (void)layoutSubviews {
NSLog(@"myCodeView-------%s",__func__);
[super layoutSubviews];
} - (void)drawRect:(CGRect)rect {
NSLog(@"myCodeView-------%s",__func__);
[super drawRect:rect];
} -(void)dealloc {
NSLog(@"myCodeView-------%s",__func__);
} @end
MyXibView:
//
// MyXibView.m
// 生命周期
//
// Created by 夏远全 on 2019/11/3.
// #import "MyXibView.h" @implementation MyXibView - (instancetype)initWithFrame:(CGRect)frame {
NSLog(@"myXibView-------%s",__func__);
return [super initWithFrame:frame];
} - (nullable instancetype)initWithCoder:(NSCoder *)coder {
NSLog(@"myXibView-------%s",__func__);
return [super initWithCoder:coder];
} -(void)awakeFromNib {
NSLog(@"myXibView-------%s",__func__);
return [super awakeFromNib];
} -(instancetype)init {
NSLog(@"myXibView-------%s",__func__);
return [super init];
} - (void)willMoveToSuperview:(nullable UIView *)newSuperview {
NSLog(@"myXibView-------%s",__func__);
[super willMoveToSuperview:newSuperview];
} - (void)didMoveToSuperview {
NSLog(@"myXibView-------%s",__func__);
[super didMoveToSuperview];
} - (void)willMoveToWindow:(nullable UIWindow *)newWindow {
NSLog(@"myXibView-------%s",__func__);
[super willMoveToWindow:newWindow];
} - (void)didMoveToWindow {
NSLog(@"myXibView-------%s",__func__);
[super didMoveToWindow];
} - (void)layoutSubviews {
NSLog(@"myXibView-------%s",__func__);
[super layoutSubviews];
} - (void)drawRect:(CGRect)rect {
NSLog(@"myXibView-------%s",__func__);
[super drawRect:rect];
} -(void)dealloc {
NSLog(@"myCodeView-------%s",__func__);
} @end
三 、注释
init: 通过init实例化时调用,最终会调用initWithFrame,默认使用frame为CGRectZero initWithFrame: 给出一个frame进行实例化时,会调用 initWithCoder: 通过xib文件创建时,进行反序列化调用 awakeFromNib: 通过xib反序列化后唤醒,初始化调用 willMoveToSuperview: 在视图即将加入或者移除时调用,如果参数newSuperview有值,则为即将加入到父视图,如果为空值,则即将从父视图移除 didMoveToSuperview: 在视图即完全加入或者移除时调用,如果参数newSuperview有值,则为完全加入到父视图,如果为空值,则完全从父视图移除 willMoveToWindow: 在视图即将加入或者移除时调用,如果参数newWindow有值,则为即将加入到窗体,如果为空值,则即将从窗体移除 didMoveToWindow: 在视图完全加入或者移除时调用,如果参数newWindow有值,则为完全加入到窗体,如果为空值,则完全从窗体移除 layoutSubviews: 对所有的子视图进行布局时调用 drawRect: 通过xib文件创建的view在结束布局后进行绘制,此时调用 dealloc: 当前视图从父视图移除并置为空时,对象销毁调用
四 、测试
MyCodeView:
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"创建过程:");
_codeView = [[MyCodeView alloc] init];
[self.view addSubview:_codeView];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
NSLog(@"移除过程:");
[self.codeView removeFromSuperview];
[self setCodeView:nil];
}
-- ::48.017455+ 生命周期[:] 创建过程:
-- ::48.017693+ 生命周期[:] myCodeView--------[MyCodeView init]
-- ::48.017831+ 生命周期[:] myCodeView--------[MyCodeView initWithFrame:]
-- ::48.018089+ 生命周期[:] myCodeView--------[MyCodeView willMoveToSuperview:]
-- ::48.018259+ 生命周期[:] myCodeView--------[MyCodeView didMoveToSuperview]
-- ::48.030801+ 生命周期[:] myCodeView--------[MyCodeView willMoveToWindow:]
-- ::48.031085+ 生命周期[:] myCodeView--------[MyCodeView didMoveToWindow]
-- ::48.035874+ 生命周期[:] myCodeView--------[MyCodeView layoutSubviews]
-- ::49.043080+ 生命周期[:] 移除过程:
-- ::49.043505+ 生命周期[:] myCodeView--------[MyCodeView willMoveToSuperview:]
-- ::49.043670+ 生命周期[:] myCodeView--------[MyCodeView willMoveToWindow:]
-- ::49.043856+ 生命周期[:] myCodeView--------[MyCodeView didMoveToWindow]
-- ::49.043977+ 生命周期[:] myCodeView--------[MyCodeView didMoveToSuperview]
-- ::49.044246+ 生命周期[:] myCodeView--------[MyCodeView dealloc]
MyXibView:
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"创建过程:");
_xibView = [[NSBundle mainBundle] loadNibNamed:@"MyXibView" owner:self options:nil][];
[self.view addSubview:_xibView];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
NSLog(@"移除过程:");
[self.xibView removeFromSuperview];
[self setXibView:nil];
}
-- ::37.271733+ 生命周期[:] 创建过程:
-- ::37.272366+ 生命周期[:] myXibView--------[MyXibView initWithCoder:]
-- ::37.272802+ 生命周期[:] myXibView--------[MyXibView awakeFromNib]
-- ::37.273005+ 生命周期[:] myXibView--------[MyXibView willMoveToSuperview:]
-- ::37.273185+ 生命周期[:] myXibView--------[MyXibView didMoveToSuperview]
-- ::37.285532+ 生命周期[:] myXibView--------[MyXibView willMoveToWindow:]
-- ::37.285846+ 生命周期[:] myXibView--------[MyXibView didMoveToWindow]
-- ::37.291993+ 生命周期[:] myXibView--------[MyXibView layoutSubviews]
-- ::37.292182+ 生命周期[:] myXibView--------[MyXibView layoutSubviews]
-- ::37.292659+ 生命周期[:] myXibView--------[MyXibView drawRect:]
-- ::38.979328+ 生命周期[:] 移除过程:
-- ::38.979581+ 生命周期[:] myXibView--------[MyXibView willMoveToSuperview:]
-- ::38.979720+ 生命周期[:] myXibView--------[MyXibView willMoveToWindow:]
-- ::38.979915+ 生命周期[:] myXibView--------[MyXibView didMoveToWindow]
-- ::38.980028+ 生命周期[:] myXibView--------[MyXibView didMoveToSuperview]
-- ::38.980257+ 生命周期[:] myCodeView--------[MyXibView dealloc]
五 、总结
- 不论是纯代码的创建View还是xib创建的View,在添加到容器中和从容器中移除时,都会调用willMoveToSuperview、didMoveToSuperview、willMoveToWindow、didMoveToWindow这四个方法,只不过调用顺序有所变化;
- 使用纯代码创建View时,只要调用了init方法,就一定会调用initWithFrame方法,会调用一次布局;
- 使用Xib创建的View时,需要进行反序列化和唤醒,也即调用initWithCoder、awakeFromNib方法, 会调用两次布局,然后进行绘制;
iOS:捋一遍View的生命周期的更多相关文章
- iOS:从头捋一遍VC的生命周期
一.介绍 UIViewController是iOS开发中的核心控件,没有它那基本上任何功能都无法实现,虽然系统已经做了所有控件的生命维护,但是,了解它的生命周期是如何管理还是非常有必要的.网上有很多教 ...
- iOS:viewController 和 view 的生命周期、不错的代码设计风格
一.介绍: viwe和viewController的生命周期是最基本的知识,如果很好地理解它们的方法调用的执行顺序,就能很好地设计代码的风格.这篇博客转载自:http://www.cnblogs.co ...
- iOS开发——UI进阶篇(十)导航控制器、微博详情页、控制器的View的生命周期
一.导航控制器出栈 1.initWithRootViewController本质 UIViewController *vc = [[OneViewController alloc] init]; // ...
- 创建控制器的方法、控制器加载view过程、控制器view的生命周期、多控制器组合
在介绍四大对象的那篇博客中,可以基本了解到程序启动的过程: main-->UIApplicationMain-->创建UIApplication的实例和app代理AppDelegate的实 ...
- View的生命周期
当一个进入一个新viewController的时候,viewController的view的生命周期一般是这样的: 1.先判断内存是否有这个View a.没有的话:生命周期为loadView-> ...
- IOS的工程目录结构和生命周期
IOS的工程目录结构和生命周期 ·simple table文件夹:工程相关源代码和配置文件 BIDAppDelegate : 委托的声明和实现 BIDViewController: 视图控 ...
- 在ViewController中View的生命周期
view的生命周期如下(按顺序) -(void)loadView 用代码初始化的时候,第一个调用该方法.可以在这里面addSubView. -(void)viewDidLoad 初始化时一些数据的设置 ...
- Android View的生命周期
View生命周期相关方法 View是什么?官方源码注释中的定义:这个类是用户接口的基础构件.View表示屏幕上的一块矩形区域,负责绘制这个区域和事件处理. View是所有widget类的基类,Widg ...
- Android开发——View的生命周期总结
0.前言 今天看到一个概念是View的生命周期,有点懵逼,听说过Activity的生命周期,Fragment的生命周期,对View的生命周期好像没什么概念啊.难道layout.draw这些也算是生命周 ...
随机推荐
- 任正非讲话稿 PDF整理版
任正非讲话稿 PDF整理版 任正非思想之路 这里收录了任正非讲话稿400余篇,从1994年到2018年,从深圳.中国到东南亚.非洲.欧洲.美洲,从研发.市场.服务到财经.人力资源.战略.内控与公共关系 ...
- sqlserver 筛选索引(filter index)在使用时需要注意的事项
sqlserver 的筛选索引(filter index)与常规的非筛选索引,加了一定的filter条件,可以按照某些条件对表中的字段进行索引,但是filter 索引在查询 使用上,并不等同于常规的索 ...
- java中使用lambda表达式
使用lambda表达式能够使复杂的编写方式变的简单 lambda表达式的语法 (parameters) -> expression 或 (parameters) ->{ statement ...
- JS-正则表达式解析
正则表达式通常用于输入校验,用法示例为 if (!(/^1[345789]\d{9}$/.test($('.tel').val()))) { $.toast("手机号格式有误", ...
- JeeSite | 保存信息修改记录封装
前面写过两篇关于“保存信息修改记录”的内容,分别如下: JeeSite | 保存信息修改记录 JeeSite | 保存信息修改记录续 回顾 第一篇文章通过类字段的比较返回一个有字段值不 ...
- 呵呵,asp.net 屁东西我都会忘记
ASP.NET中的好些基本的东西有的忘了,有的需要学,从现在开始,给自己开一个基本的常用知识点的总结,一是学习,二是备忘. 今天算是第一篇吧! DropDownList在从数据库中得到数据源绑定后,计 ...
- SpringCloud微服务(06):Config组件,实现配置统一管理
本文源码:GitHub·点这里 || GitEE·点这里 一.Config简介 在微服务系统中,服务较多,相同的配置:如数据库信息.缓存.参数等,会出现在不同的服务上,如果一个配置发生变化,需要修改很 ...
- 微信公众号支付提示当前页面的URL未注册
问题: 记一下前端时间自己做了一个微信公众号支付的功能,因为有一段时间没有接触过了微信支付方面的开发,居然忘记了在微信商户商户号中配置了对应的支付目录,所以提示我当前的域名是没有注册的. 设置支付目录 ...
- 【UR #5】怎样更有力气
Problem Description 大力水手问禅师:"大师,很多事情都需要用很大力气才能完成,而我在吃了菠菜之后力气很大,于是就导致我现在非常依赖菠菜.我很讨厌我的现状,有没有办法少吃点 ...
- 使用 Docker 构建 Nebula Graph 源码
Nebula Graph 介绍 Nebula Graph 是开源的高性能分布式图数据库.项目使用 C++ 语言开发,cmake 工具构建.其中两个重要的依赖是 Facebook 的 Thrift RP ...