iOS开发进阶(十):viewController生命周期讲解

文章目录

    • 一、生命周期
    • 二、注意事项
    • 案例讲解

一、生命周期

viewController有自己的生命周期,其生命周期如下图:

在这里插入图片描述

  • init - 初始化程序;
  • loadView - 在UIViewController对象的view被访问且为空的时候调用;
  • viewDidLoad - 视图加载完成后调用;
  • viewWillAppear - UIViewController对象的视图即将加入窗口时调用;
  • viewDidAppear - UIViewController对象的视图已经加入窗口时调用;
  • viewWillDisappear - UIViewController对象的视图即将消失时调用;
  • viewDidDisappear - UIViewController对象的视图已经消失时调用;
  • didReceiveMemoryWarning - 出现内存警告;
  • dealloc - 视图被销毁,此次需要在initviewDidLoad中创建的对象进行释放;

初始化

  • init 方法:初始化UIViewController,执行关键数据初始化操作。不要在此操作view,view在loadView: 方法中才初始化。

加载视图

  • loadView: 方法是在UIViewController对象的view被访问且为空的时候调用,这个方法会加载或者创建一个view并将其赋值给view属性。在ViewController的生命周期中没有特殊情况只会被调用一次。
    你可以通过重写该方法来手动初始化views。在该方法的实现中,不能调用super。
  • viewDidLoad 方法:view加载完成后调用。通常,对于各种初始化数据的载入,初始设定、修改约束、移除视图等很多操作都可以这个方法中实现。通常在此方法中添加一些控件和视图。
  • viewWillAppear 方法:系统在载入所有的数据后,将会在屏幕上显示视图,这时会先调用这个方法,通常会在这个方法对即将显示的视图做进一步的设置。比如,设置设备不同方向时该如何显示;设置状态栏方向、设置视图显示样式等。
    当APP有多个视图时,上下级视图切换是也会调用这个方法,如果在调入视图时,需要对数据做更新,就只能在这个方法内实现。
  • viewDidAppear 方法:UIViewController对象的视图已经加入窗口时调用。这时可以对正在显示的视图做设置。
  • viewWillDisAppear 方法:UIViewController对象的视图即将消失、被覆盖或是隐藏时调用。
  • viewDidDisAppear 方法:UIViewController对象的视图已经消失、被覆盖或是隐藏时调用。

内存警告

  • didReceiveMemoryWarning 方法:在内存足够的情况下,app视图通常会一直保存在内存中,如果内存不够,会释放掉自己拥有的视图。系统只会释放内存,不会释放对象的所有权,通常需要在这里将不需要显示在内存中保留的对象释放它的所有权,置为nil。

视图销毁
dealloc 方法:销毁视图,释放资源。不要手动调用此方法,当引用计数值为0的时候,系统会自动调用此方法。

二、注意事项

loadViewviewDidLoad的区别就是,loadView时view还没有生成,viewDidLoad时,view已经生成了,loadView只会被调用一次,而viewDidLoad可能会被调用多次(View可能会被多次加载),当view被添加到其他view中之前,会调用viewWillAppear,之后会调用viewDidAppear。当view从其他view中移除之前,调用viewWillDisAppear,移除之后会调用viewDidDisappear。当view不再使用时,受到内存警告时,ViewController会将view释放并将其指向为nil

案例讲解

分为A和B两个视图。

A视图:

AViewController.h 文件:

#import <UIKit/UIKit.h>
#import "BViewController.h"
 
NS_ASSUME_NONNULL_BEGIN
 
@interface AViewController : UIViewController
 
@end
 
NS_ASSUME_NONNULL_END

AViewController.m文件:

#import "AViewController.h"
 
@interface AViewController ()
 
@end
 
@implementation AViewController
 
- (void) loadView {
    [super loadView];
 
    NSLog(@"AViewController loadView");
}
 
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.view.backgroundColor = [UIColor whiteColor];
    
    UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = CGRectMake(100, 100, 100, 50);
    button.center = self.view.center;
    [button setTitle:@"按键" forState:UIControlStateNormal];
    [button addTarget:self action:@selector(press:) forControlEvents:UIControlEventTouchUpInside];
    
    [self.view addSubview:button];
    
    NSLog(@"AViewController viewDidLoad");
}
 
- (void) viewWillAppear:(BOOL)animated {
    NSLog(@"AViewController viewWillAppear");
}
 
- (void) viewDidAppear:(BOOL)animated {
    NSLog(@"AViewController viewDidAppear");
}
 
- (void) viewWillDisappear:(BOOL)animated {
    NSLog(@"AViewController viewWillDisappear");
}
 
- (void) viewDidDisappear:(BOOL)animated {
    NSLog(@"AViewController viewDidDisappear");
}
 
- (void) didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    
    NSLog(@"AViewController didReceiveMemoryWarning");
}
 
- (void) press:(UIButton*)sender {
    BViewController* bViewController = [[BViewController alloc] init];
    
    bViewController.modalPresentationStyle = UIModalPresentationFullScreen;
    
    NSLog(@"A->B");
    
    [self presentViewController:bViewController animated:YES completion:nil];
}
 
@end

BViewController.h文件:

#import <UIKit/UIKit.h>
 
NS_ASSUME_NONNULL_BEGIN
 
@interface BViewController : UIViewController
 
@end
 
NS_ASSUME_NONNULL_END

BViewController.m文件:

#import "BViewController.h"
 
@interface BViewController ()
 
@end
 
@implementation BViewController
 
- (void) loadView {
    [super loadView];
    
    NSLog(@"BViewController loadView");
}
 
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.view.backgroundColor = [UIColor yellowColor];
 
    UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = CGRectMake(100, 100, 100, 50);
    button.center = self.view.center;
    [button setTitle:@"按键" forState:UIControlStateNormal];
    [button addTarget:self action:@selector(press:) forControlEvents:UIControlEventTouchUpInside];
    
    [self.view addSubview:button];
    
    NSLog(@"BViewController viewDidLoad");
}
 
- (void) viewWillAppear:(BOOL)animated {
    NSLog(@"BViewController viewWillAppear");
}
 
- (void) viewDidAppear:(BOOL)animated {
    NSLog(@"BViewController viewDidAppear");
}
 
- (void) viewWillDisappear:(BOOL)animated {
    NSLog(@"BViewController viewWillDisappear");
}
 
- (void) viewDidDisappear:(BOOL)animated {
    NSLog(@"BViewController viewDidDisappear");
}
 
- (void) press:(UIButton*)sender {
    NSLog(@"B->A");
 
    [self dismissViewControllerAnimated:YES completion:nil];
}
 
@end

运行结果:

2022-09-18 18:34:13.549033+0800 ViewController[25007:24031989] AViewController loadView
2022-09-18 18:34:13.554447+0800 ViewController[25007:24031989] AViewController viewDidLoad
2022-09-18 18:34:13.563963+0800 ViewController[25007:24031989] AViewController viewWillAppear
2022-09-18 18:34:13.697255+0800 ViewController[25007:24031989] AViewController viewDidAppear
2022-09-18 18:34:16.421472+0800 ViewController[25007:24031989] A->B
2022-09-18 18:34:16.422527+0800 ViewController[25007:24031989] BViewController loadView
2022-09-18 18:34:16.423160+0800 ViewController[25007:24031989] BViewController viewDidLoad
2022-09-18 18:34:16.428482+0800 ViewController[25007:24031989] AViewController viewWillDisappear
2022-09-18 18:34:16.428732+0800 ViewController[25007:24031989] BViewController viewWillAppear
2022-09-18 18:34:16.933891+0800 ViewController[25007:24031989] BViewController viewDidAppear
2022-09-18 18:34:16.934169+0800 ViewController[25007:24031989] AViewController viewDidDisappear
2022-09-18 18:34:31.586055+0800 ViewController[25007:24031989] B->A
2022-09-18 18:34:31.587979+0800 ViewController[25007:24031989] BViewController viewWillDisappear
2022-09-18 18:34:31.588890+0800 ViewController[25007:24031989] AViewController viewWillAppear
2022-09-18 18:34:32.093543+0800 ViewController[25007:24031989] AViewController viewDidAppear
2022-09-18 18:34:32.093834+0800 ViewController[25007:24031989] BViewController viewDidDisappear

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/495482.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言例4-28:求两个正整数的最大公约数。

算法分析&#xff1a; 输入两个正整数m和nm%n 的余数 r&#xff0c;然后 mn;nr;当 n0, 则m是最大公约数&#xff0c;算法结束&#xff1b;否则转至执行2&#xff0c;重复上述过程&#xff0c;直到n0为止 代码如下&#xff1a; //求两个正整数的最大公约数。 #include<std…

语落AI论文助手-轻松降重加素材,让论文写作更加简单高效

今天给大家推荐一款AI论文写作工具&#xff1a;语落AI论文助手。 语落AI论文助手是一款专业的AI论文写作工具&#xff0c;它最大的特色是支持论文素材查询&#xff0c;论文内容改写&#xff0c;可以高效生成论文内容&#xff0c;轻松给论文降重。 它的网址是&#xff1a;语落-…

LeetCode hot100-20

48. 旋转图像给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。这题说了不能用辅助矩阵&#xff0c;但是不辅助我做不出来。还是暴力解…

如何借用 NTFS 交换数据流 实现隐藏文件?如何使用【文件包含】PHP伪协议?不同操作系统如何实现文件隐藏和木马伪装?

如何借用 NTFS 交换数据流 实现隐藏文件?如何使用【文件包含】PHP伪协议?不同操作系统如何实现文件隐藏和木马伪装? NTFS交换数据流(Alternate Data Streams, ADS)是NTFS文件系统特有的一种功能,它允许在同一个文件名下存储多个数据流。除了默认的数据流(通常用于存储文…

Wi-Fi 标准的演进

在数字时代的今天&#xff0c;Wi-Fi已经成为了我们生活中不可或缺的一部分&#xff0c;但这一无线通信技术的演进却是一个精彩而丰富的历程。从最初迈出的第一步&#xff0c;到如今的Wi-Fi 7高速数据传输&#xff0c;每一个Wi-Fi标准的诞生都伴随着无数创新和技术的突破。 802.…

Web漏洞--WAF绕过+堆叠查询

Stacked injections(堆叠注入)从名词的含义就可以看到应该是一堆 sql语句(多条)一起执行。而在真实的运用中也是这样的&#xff0c;我们知道在mysql 中&#xff0c;主要是命令行中&#xff0c;每一条语句结尾加;表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做…

Cornflakes: Zero-Copy Serialization for Microsecond-Scale Networking——论文泛读

SOSP 2023 Paper 论文阅读笔记整理 问题 数据序列化对于许多数据中心应用程序来说至关重要&#xff0c;序列化的主要开销在于数据移动&#xff0c;将应用程序数据移动到数据包中所需的内存拷贝成本高昂。最近的零拷贝API暴露了NIC分散收集功能&#xff0c;增加了将数据移动卸…

vant4的dialog、toast不显示样式记录

使用的是按需加载&#xff0c;就是这个 插件会自动帮我们把组件加载上去&#xff0c;但是对于函数式的组件&#xff0c;比如dialog&#xff0c;toast这样的&#xff0c;就会显示的时候没有样式&#xff0c;类似这样 这是因为没有加载对应插件的样式&#xff0c;需要手动加载进来…

Java:反射 reflection ( 概念+相关类+使用方法)

文章目录 一、反射(reflection)1.概念优点&#xff1a;缺点 2.反射的相关类1.Class类1.**反射机制的起源**2.获得类相关的方法3.获得类中属性的相关方法4.获得类中注解相关的方法5.获得类中构造器相关的方法6.获得类中方法相关的方法 2.获取Class对象的三种方法&#xff1a;1.使…

python--冒泡排序和main函数

1.判断是不是回文数&#xff1a; x int(input("请输入一个正整数&#xff1a;")) x str(x) if x x[::-1]:print("是回文数。") else:print("不是回文数。") 2.冒泡排序 # 冒泡排序: # [30&#xff0c;8&#xff0c;-10&#xff0c; 50&am…

【技巧】PyTorch限制GPU显存的可使用上限

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 从 PyTorch 1.4 版本开始&#xff0c;引入了一个新的功能 torch.cuda.set_per_process_memory_fraction(fraction, device)&#xff0c;这个功能允许用户为特定的 GPU 设备设置进程可使用的显存上限比例。 测试代…

从抛硬币试验看概率论的基本内容及统计方法

一般说到概率&#xff0c;就喜欢拿抛硬币做例子。大多数时候&#xff0c;会简单认为硬币正背面的概率各为二分之一&#xff0c;其实事情远没有这么简单。这篇文章会以抛硬币试验为例子并贯穿全文&#xff0c;引出一系列概率论和数理统计的基本内容。这篇文章会涉及的有古典概型…

后端前行Vue之路(二):模版语法之插值与指令

1.概述 Vue.js的模板语法是一种将Vue实例的数据绑定到HTML文档的方法。Vue的模板语法是一种基于HTML的扩展&#xff0c;允许开发者将Vue实例中的数据绑定到HTML元素&#xff0c;以及在HTML中使用一些简单的逻辑和指令。Vue.js 基于 HTML 的模板语法允许开发者声明式地将 DOM 绑…

eBMC套件固件烧录及上电过程

1 概述 本期讲解 eBMC 套件上电和固件烧录过程。关于 eBMC 套件的开关、接口和芯片位置&#xff0c;可查看前两期文章&#xff0c;里面有详细描述。 2 固件烧录 eBMC 套件烧录涉及以下固件、其芯片位置和烧录口位置&#xff1a; 其中&#xff0c;eBMC-D4 板上固件可…

【嵌入式机器学习开发实战】(七)—— 政安晨:通过ARM-Linux掌握基本技能【环境准备:树莓派】

ARM-Linux是一种针对ARM架构的操作系统&#xff0c;它的设计目标是在低功耗、低成本的硬件平台上运行。ARM-Linux可以运行在多种ARM处理器上&#xff0c;包括树莓派。 树莓派&#xff08;Raspberry Pi&#xff09;是一款基于ARM架构的单板计算机&#xff0c;由英国的树莓派基金…

Python模糊字符串匹配工具库之fuzzywuzzy使用详解

概要 Python的fuzzywuzzy库是一个强大的模糊字符串匹配工具,基于Levenshtein距离算法,可用于处理文本相似度匹配任务。本文将深入探讨fuzzywuzzy库的各种功能和用法,结合详细的描述和丰富的示例代码,带领大家全面了解这个工具的使用方法和实际应用场景。 安装 在开始使用…

react-navigation

Getting started | React Navigation

python实战之基础篇(一)

1. 注释 # coding utf-8 # 该注释放到文件第一行, 这个注释告诉python解释器该文件的编码集是UTF-82. 导入语句有三种形式 import <模块名> from <模块名> import <代码元素> from <模块名> import <代码元素> as <代码元素别名>3. 获取…

HCIP-Datacom(H12-821)题库补充(3/28)

最新 HCIP-Datacom&#xff08;H12-821&#xff09;完整题库请扫描上方二维码访问&#xff0c;持续更新中。 如图所示组网&#xff0c;以下关于R4优选路由的描述&#xff0c;正确的是哪一项&#xff1f; A&#xff1a;无法判断&#xff0c;MED不能作为AS之间BGP选路的条件 B&a…

Chakra UI:重塑React组件开发的未来

随着前端开发技术的不断演进&#xff0c;React已经成为了一个不可或缺的开源JavaScript库&#xff0c;用于构建用户界面。然而&#xff0c;虽然React提供了构建用户界面的强大工具&#xff0c;但在组件的可访问性、可重复使用性和可组合性方面仍存在挑战。Chakra UI正是一个为解…