IOS 生命周期-view和uiviewcontroller的生命周期

2024-05-04 02:58

本文主要是介绍IOS 生命周期-view和uiviewcontroller的生命周期,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考自滚滚猫的《iOS APP生命周期 和 UIViewController的生命周期》,沧州宁少的《iOS App生命周期》。

1.如果创建视图对象使用的是[[MyViewController alloc] init],执行顺序是init->viewDidLoad,但如果我在MyViewController.m中重写了init,并且在init方法中写入了涉及视图(self.view等)属性的代码,就会在该处暂停init的执行,而去执行viewDidLoad,然后再回来执行init,(注意viewDidLoad在视图生命周期中只执行一次),所以不要再重写的init中加入视图相关代码。

 

APP的生命周期:

一:应用的五种状态

1.未运行(Not running)状态:程序没启动。

2.未激活(Inactive)状态:程序在前台运行,不过没有接收到事件。

一般每当应用要从一个状态切换到另一个不同的状态时,中途过渡会短暂停留在此状态。唯一在此状态停留时间比较长的情况是:当用户锁屏时,或者系统提示用户去响应某些(诸如电话来电、有未读短信等)事件的时候。

3.激活(Active):程序在前台运行而且接收到了事件。这也是前台的一个正常的模式。

4.后台(Backgroud):程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。时间到之后会进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态。

5.挂起(Suspended):程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。

二:函数执行顺序

1.首先执行的是main.m类中的main函数。

这个函数的主要作用是创建一个UIApplication对象,创建它对应的一个代理对象,开启RunLoop运行循环,如果UIStoryBoard存在的话,则从UIStoryBoard中加载用户界面。

在应用程序启动的时候,UIApplication会初始化一些核心对象,并启动运行。UIApplication对象是每个iOS的核心对象。负责帮助iOS系统和其他对象之间的交互.列表列举一下每个对象,UIApplication 管理事件循环和高层组件的行为,负责完成iOS系统和我们定义对象的交互。UIAppdelegate 监听Application中各种状态,Documents和Data Objects 数据模型对象存储应用的内容,针对特定应用的。

UIViewController 视图管理器管理应用程序内容在屏幕上的显示。视图控制器管理着一个根视图和一个子视图的集合。视图控制器通过把视图View安装到UIWindow上以展示在屏幕上。UIViewController是所有视图控制器的基类。封装了类似屏幕旋转。视图展示等一些列的操作。

UIWindow 窗口对象UIWindow。协调屏幕上一个或者多个视图的展示。 大多数应用只有一个窗口。有一些应用有更多的窗口。但应用程序可能额外的窗口,用于在有外接显示器上显示内容。窗口内容从来不会被替换。屏幕内容的改变都是通过视图控制器来完成的。除了管理视图。窗口对象和UIApplication传递事件到UIView和CALayer.

UIView/CALayer  视图和控件提供可视化的展示。层对象实际上是代表视觉内容的数据对象,视图会大量的使用层对象来控制内容。

 

 

 

主运行循环

应用程序的运行循环处理所有与用户相关的事件。UIApplication对象在应用启动的时候运行循环,用来处理事件和视图的更新。顾名思义,各种事件在主运行循环串行执行。保证了执行的先后顺序。

用户和设备交互的事件是由操作系统产生的,这些事件发生到UIKit会建立一个端口。事件会在一个事件队列中排序。逐个分发。一个触摸(Touch)事件通常先分发到主窗口对象,然后依次分发到触摸事件发生的视图。但是这些事件并非是通过主运行循环进行分发。有些事件发生到代理对象和函数对象中。iOS中主要的事件类型包括:触摸事件,远程控制事件,摇晃事件,加速器事件,定位。

 

 

 

 

 

 

 

2.然后依次执行:

application:willFinishLaunchingWithOptions:

在App启动时调用表示应用加载进程已经开始,常用来处理应用状态的存储和恢复。

application:didFinishLaunchingWithOptions:

表示App将从未运行状态进入运行状态,用于对App的初始化操作。

applicationDidBecomeActive:

当应用即将进入前台运行时调用。

applicationWillResignActive:

当应用即将进从前台退出时调用。

applicationDidEnterBackground:

当应用开始在后台运行的时候调用。

applicationWillEnterForeground:

当程序从后台将要重新回到前台(但是还没变成Active状态)时候调用。

applicationWillTerminate:

当前应用即将被终止,在终止前调用的函数。通常是用来保存数据和一些退出前的清理工作。如果应用当前处在suspended,此方法不会被调用。 该方法最长运行时限为5秒,过期应用即被kill掉并且移除内存。

 

 

状态转换

三:一些APP的生命周期的场景

1、程序启动:状态由Not running -> Inactive -> Active

willFinishLaunchingWithOptions

didFinishLaunchingWithOptions

applicationDidBecomeActive

2、点击home键|锁屏:由Active -> Inactive -> Backgroud

applicationWillResignActive

applicationDidEnterBackground

3、重新进入前台:Backgroud -> Inactive -> Active 

applicationWillEnterForeground

applicationDidBecomeActive

4、在前台,双击home键,手动杀掉APP:Active -> Inactive -> Backgroud -> end

applicationWillResignActive

applicationDidEnterBackground

applicationWillTerminate

5、当URL到达时,如果你的应用没在正在运行,则会被启动并且移到前台运行以打开URL

application:didFinishLaunchingWithOptions:

application:openURL:sourceApplication:

applicationDidBecomeActive

6、当URL到达时,如果你的应用正在background运行或被suspended,它将会被移到前台以打开URL

applicationWillEnterForeground

application:openURL:sourceApplication:

applicationDidBecomeActive

 

一个比较全面生命周期执行流程图:

 

 

生命周期执行流程

UIViewController的生命周期:

编译时:

+(void)load

只要类所在文件被引用就会被调用,方法只会被调用一次。

+(void)initialize

类或者其子类的第一个方法被调用前调用,方法只会被调用一次。

当一个视图控制器被创建,并在屏幕上显示的时候。 代码的执行顺序

1、 alloc

创建对象,分配空间

2、init (initWithNibName|initWithCoder)

初始化对象,初始化数据

3、awakeFromNib

所有视图的outlet和action已经连接,但还没有被确定。

4、loadView

完成一些关键view的初始化工作,加载view。

5、viewDidLoad

载入完成,可以进行自定义数据以及动态创建其他控件

6、viewWillAppear

视图将出现在屏幕之前

7、viewWillLayoutSubviews

将要对子视图进行调整

8、viewDidLayoutSubviews

对子视图进行调整完毕

9、viewDidAppear

视图已在屏幕上渲染完成

10、viewWillDisappear

视图将被从屏幕上移除

11、viewDidDisappear

视图已经被从屏幕上移除

12、dealloc

视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放

13、didReceiveMemoryWarning

内存警告

 

 

 

 

 

 

IOS APP启动时间

 

这篇关于IOS 生命周期-view和uiviewcontroller的生命周期的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/958208

相关文章

关于Maven生命周期相关命令演示

《关于Maven生命周期相关命令演示》Maven的生命周期分为Clean、Default和Site三个主要阶段,每个阶段包含多个关键步骤,如清理、编译、测试、打包等,通过执行相应的Maven命令,可以... 目录1. Maven 生命周期概述1.1 Clean Lifecycle1.2 Default Li

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

Maven(插件配置和生命周期的绑定)

1.这篇文章很好,介绍的maven插件的。 2.maven的source插件为例,可以把源代码打成包。 Goals Overview就可以查看该插件下面所有的目标。 这里我们要使用的是source:jar-no-fork。 3.查看source插件的example,然后配置到riil-collect.xml中。  <build>   <plugins>    <pl

MVC(Model-View-Controller)和MVVM(Model-View-ViewModel)

1、MVC MVC(Model-View-Controller) 是一种常用的架构模式,用于分离应用程序的逻辑、数据和展示。它通过三个核心组件(模型、视图和控制器)将应用程序的业务逻辑与用户界面隔离,促进代码的可维护性、可扩展性和模块化。在 MVC 模式中,各组件可以与多种设计模式结合使用,以增强灵活性和可维护性。以下是 MVC 各组件与常见设计模式的关系和作用: 1. Model(模型)

MFC中App,Doc,MainFrame,View各指针的互相获取

纸上得来终觉浅,为了熟悉获取方法,我建了个SDI。 首先说明这四个类的执行顺序是App->Doc->Main->View 另外添加CDialog类获得各个指针的方法。 多文档的获取有点小区别,有时间也总结一下。 //  App void CSDIApp::OnApp() {      //  App      //  Doc     CDocument *pD

【Vue】关于Vue3的生命周期

目录 Vue3中新增了一个setup生命周期函数:(1) setup执行的时机是在beforeCreate生命周期函数之前执行,在setup函数中是不能通过this来获取实例的;(2) 为了命名的统一性,将beforeDestroy 改名为 beforeUnmount,destroyed 改名为 unmounted 生命周期函数: setup —— 不能通过this来获

09 生命周期

生命周期 beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestorydestoryed 辣子鸡:香辣入口,犹如吃了炫迈一样 - - - 根本停不下来 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport"

Maven生命周期:深入理解构建过程

目录 1. Maven生命周期简介 2. 默认生命周期的阶段 3. 清理生命周期 4. 站点生命周期 5. Maven生命周期的灵活性 6. 结论         在Java开发中,Maven是一个不可或缺的工具,它通过自动化项目的构建、依赖管理和文档生成等任务,极大地提高了开发效率。Maven的核心之一是其构建生命周期,它定义了项目构建过程中的一系列阶段。在这篇文章中,我们将深

Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.B

一个bug日志 FATAL EXCEPTION: main03-25 14:24:07.724: E/AndroidRuntime(4135): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.syyx.jingubang.ky/com.anguotech.android.activity.Init