iOS:捋一遍View的生命週期

1、介紹ide

前面介紹了VC的生命週期,閒着沒事也來捋一捋View的生命週期,簡單用兩個類型的View來監測。一個View純代碼建立,另外一個View使用Xib建立。佈局

 

二 、代碼測試

MyCodeView: spa

//
//  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
View Code

MyXibView: code

//
//  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
View Code

 

三 、註釋對象

 init: 經過init實例化時調用,最終會調用initWithFrame,默認使用frame爲CGRectZero

 initWithFrame: 給出一個frame進行實例化時,會調用

 initWithCoder: 經過xib文件建立時,進行反序列化調用

 awakeFromNib: 經過xib反序列化後喚醒,初始化調用

 willMoveToSuperview: 在視圖即將加入或者移除時調用,若是參數newSuperview有值,則爲即將加入到父視圖,若是爲空值,則即將從父視圖移除

 didMoveToSuperview: 在視圖即徹底加入或者移除時調用,若是參數newSuperview有值,則爲徹底加入到父視圖,若是爲空值,則徹底從父視圖移除

 willMoveToWindow: 在視圖即將加入或者移除時調用,若是參數newWindow有值,則爲即將加入到窗體,若是爲空值,則即將從窗體移除

 didMoveToWindow: 在視圖徹底加入或者移除時調用,若是參數newWindow有值,則爲徹底加入到窗體,若是爲空值,則徹底從窗體移除

 layoutSubviews: 對全部的子視圖進行佈局時調用

 drawRect: 經過xib文件建立的view在結束佈局後進行繪製,此時調用

 dealloc: 當前視圖從父視圖移除並置爲空時,對象銷燬調用

 

四 、測試blog

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]; }
2019-11-03 18:53:48.017455+0800 生命週期[7776:582010] 建立過程:
2019-11-03 18:53:48.017693+0800 生命週期[7776:582010] myCodeView--------[MyCodeView init]
2019-11-03 18:53:48.017831+0800 生命週期[7776:582010] myCodeView--------[MyCodeView initWithFrame:]
2019-11-03 18:53:48.018089+0800 生命週期[7776:582010] myCodeView--------[MyCodeView willMoveToSuperview:]
2019-11-03 18:53:48.018259+0800 生命週期[7776:582010] myCodeView--------[MyCodeView didMoveToSuperview]
2019-11-03 18:53:48.030801+0800 生命週期[7776:582010] myCodeView--------[MyCodeView willMoveToWindow:]
2019-11-03 18:53:48.031085+0800 生命週期[7776:582010] myCodeView--------[MyCodeView didMoveToWindow]
2019-11-03 18:53:48.035874+0800 生命週期[7776:582010] myCodeView--------[MyCodeView layoutSubviews]
2019-11-03 18:53:49.043080+0800 生命週期[7776:582010] 移除過程:
2019-11-03 18:53:49.043505+0800 生命週期[7776:582010] myCodeView--------[MyCodeView willMoveToSuperview:]
2019-11-03 18:53:49.043670+0800 生命週期[7776:582010] myCodeView--------[MyCodeView willMoveToWindow:]
2019-11-03 18:53:49.043856+0800 生命週期[7776:582010] myCodeView--------[MyCodeView didMoveToWindow]
2019-11-03 18:53:49.043977+0800 生命週期[7776:582010] myCodeView--------[MyCodeView didMoveToSuperview]
2019-11-03 18:53:49.044246+0800 生命週期[7776:582010] myCodeView--------[MyCodeView dealloc]

MyXibView:rem

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSLog(@"建立過程:"); 
    _xibView = [[NSBundle mainBundle] loadNibNamed:@"MyXibView" owner:self options:nil][0];
    [self.view addSubview:_xibView];
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    NSLog(@"移除過程:");
    [self.xibView removeFromSuperview];
    [self setXibView:nil];
}
2019-11-03 18:54:37.271733+0800 生命週期[7807:583483] 建立過程:
2019-11-03 18:54:37.272366+0800 生命週期[7807:583483] myXibView--------[MyXibView initWithCoder:]
2019-11-03 18:54:37.272802+0800 生命週期[7807:583483] myXibView--------[MyXibView awakeFromNib]
2019-11-03 18:54:37.273005+0800 生命週期[7807:583483] myXibView--------[MyXibView willMoveToSuperview:]
2019-11-03 18:54:37.273185+0800 生命週期[7807:583483] myXibView--------[MyXibView didMoveToSuperview]
2019-11-03 18:54:37.285532+0800 生命週期[7807:583483] myXibView--------[MyXibView willMoveToWindow:]
2019-11-03 18:54:37.285846+0800 生命週期[7807:583483] myXibView--------[MyXibView didMoveToWindow]
2019-11-03 18:54:37.291993+0800 生命週期[7807:583483] myXibView--------[MyXibView layoutSubviews]
2019-11-03 18:54:37.292182+0800 生命週期[7807:583483] myXibView--------[MyXibView layoutSubviews]
2019-11-03 18:54:37.292659+0800 生命週期[7807:583483] myXibView--------[MyXibView drawRect:]
2019-11-03 18:54:38.979328+0800 生命週期[7807:583483] 移除過程:
2019-11-03 18:54:38.979581+0800 生命週期[7807:583483] myXibView--------[MyXibView willMoveToSuperview:]
2019-11-03 18:54:38.979720+0800 生命週期[7807:583483] myXibView--------[MyXibView willMoveToWindow:]
2019-11-03 18:54:38.979915+0800 生命週期[7807:583483] myXibView--------[MyXibView didMoveToWindow]
2019-11-03 18:54:38.980028+0800 生命週期[7807:583483] myXibView--------[MyXibView didMoveToSuperview]
2019-11-03 18:54:38.980257+0800 生命週期[7807:583483] myCodeView--------[MyXibView dealloc]

 

五 、總結it

  • 不管是純代碼的建立View仍是xib建立的View,在添加到容器中和從容器中移除時,都會調用willMoveToSuperview、didMoveToSuperview、willMoveToWindow、didMoveToWindow這四個方法,只不過調用順序有所變化;
  • 使用純代碼建立View時,只要調用了init方法,就必定會調用initWithFrame方法,會調用一次佈局;
  • 使用Xib建立的View時,須要進行反序列化和喚醒,也即調用initWithCoder、awakeFromNib方法, 會調用兩次佈局,而後進行繪製;
相關文章
相關標籤/搜索