一、介绍

前面介绍了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的生命周期的更多相关文章

  1. iOS:从头捋一遍VC的生命周期

    一.介绍 UIViewController是iOS开发中的核心控件,没有它那基本上任何功能都无法实现,虽然系统已经做了所有控件的生命维护,但是,了解它的生命周期是如何管理还是非常有必要的.网上有很多教 ...

  2. iOS:viewController 和 view 的生命周期、不错的代码设计风格

    一.介绍: viwe和viewController的生命周期是最基本的知识,如果很好地理解它们的方法调用的执行顺序,就能很好地设计代码的风格.这篇博客转载自:http://www.cnblogs.co ...

  3. iOS开发——UI进阶篇(十)导航控制器、微博详情页、控制器的View的生命周期

    一.导航控制器出栈 1.initWithRootViewController本质 UIViewController *vc = [[OneViewController alloc] init]; // ...

  4. 创建控制器的方法、控制器加载view过程、控制器view的生命周期、多控制器组合

    在介绍四大对象的那篇博客中,可以基本了解到程序启动的过程: main-->UIApplicationMain-->创建UIApplication的实例和app代理AppDelegate的实 ...

  5. View的生命周期

    当一个进入一个新viewController的时候,viewController的view的生命周期一般是这样的: 1.先判断内存是否有这个View a.没有的话:生命周期为loadView-> ...

  6. IOS的工程目录结构和生命周期

    IOS的工程目录结构和生命周期 ·simple table文件夹:工程相关源代码和配置文件 BIDAppDelegate :    委托的声明和实现 BIDViewController:    视图控 ...

  7. 在ViewController中View的生命周期

    view的生命周期如下(按顺序) -(void)loadView 用代码初始化的时候,第一个调用该方法.可以在这里面addSubView. -(void)viewDidLoad 初始化时一些数据的设置 ...

  8. Android View的生命周期

    View生命周期相关方法 View是什么?官方源码注释中的定义:这个类是用户接口的基础构件.View表示屏幕上的一块矩形区域,负责绘制这个区域和事件处理. View是所有widget类的基类,Widg ...

  9. Android开发——View的生命周期总结

    0.前言 今天看到一个概念是View的生命周期,有点懵逼,听说过Activity的生命周期,Fragment的生命周期,对View的生命周期好像没什么概念啊.难道layout.draw这些也算是生命周 ...

随机推荐

  1. 修改so库中的依赖名

    修改so库中的依赖名 在ArchLinuxArm上有一些针对aarch64, arm, armeabi-v7a等Android常用架构的so库可以下载,有时候可以省去很多编译时间,且都是编译optim ...

  2. TestNG入门教程-12-Java代码执行testng.xml和失败后重跑

    前面我们都在IDEA上右键testng.xml文件来运行testng用例,这个在编写测试用例过程是 可以这么做,但是,如果测试用例写完了,也是这么做吗?有没有什么方法,例如自动化去实现.测试脚本维护后 ...

  3. [译]Vulkan教程(25)描述符布局和buffer

    [译]Vulkan教程(25)描述符布局和buffer Descriptor layout and buffer 描述符布局和buffer Introduction 入门 We're now able ...

  4. 如何用node.js中的ejs写入页面_以6.19京东秒杀的商品为例

    用erpress搭建好基本框架后,在自己新建的express文件夹下将会生成;bin,public,routes,views,app.js,package.json,node_modules目录哟!, ...

  5. 这可能是最漂亮的Spring事务管理详解

    事务概念回顾 什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行. 事物的特性(ACID): 原子性: 事务是最小的执行单位,不允许分割.事务的原子性确保动作要么全部完成,要么完全不起作用 ...

  6. IT兄弟连 HTML5教程 设置IE9以下版本浏览器支持HTML5

    HTML2.HTML5刚发布时由于各浏览器之间的标准不统一,开发者的时间都浪费在解决Web浏览器之间的兼容性上.但由于W3C和WHATWG对HTML5新版本的制定,以及近年来对HTML5的使用,再加上 ...

  7. docker tomcat8 mysql8部署常见错误

    出现docker: out of memory bug ,内存溢出 解决方法: free -mh 应该看一下内存 内存优化/买内存 出现java.util.zip.ZipException: erro ...

  8. linux学习(四)复制(cp)移动(mv)删除(rm)查找(find)文件、文件夹操作、软硬链接的区别

    目录 复制文件 mv命令 rm命令 touch 命令 file命令 find命令 grep命令 mkdir命令 rmdir命令 @(复制移动删除查找文件.软硬链接的区别) 复制文件 cp命令用于复制文 ...

  9. .Net Core 3.0开源可视化设计CMS内容管理系统建站系统

    简介 ZKEACMS,又名纸壳CMS,是可视化编辑设计的内容管理系统.基于.Net Core开发可跨平台运行,并拥有卓越的性能. 纸壳CMS基于插件式设计,功能丰富,易于扩展,可快速创建网站. 布局设 ...

  10. ElasticSearch7 设置外网访问失败

    elasticsearch外网访问9200端口失败,bootstrap checks failed,the default discovery settings are unsuitable for ...