iOS的应用生命周期以及应用界面

在iOS的原生开发中,我们需要特别关注两个东西:AppDelegate和ViewController 。我们主要的编码工作就是在AppDelegate和ViewControlle这两个类中进行的。它们的类图如下图所示:
AppDelegate是应用程序委托对象,它继承了UIResponder类,并实现了UIApplicationDelegate委托协议。UIResponder类可以使子类AppDelegate具有处理响应事件的能力,而UIApplicationDelegate委托协议使AppDelegate能够成为应用程序委托对象,这种对象能够响应应用程序的生命周期,该类中继承的一系列方法在应用生命周期的不同阶段会被回调。相应的,AppDelegate的子类也可以实现这两个功能。

ViewController类继承自UIViewController类,它是视图控制器类,在工程中扮演者根视图和用户事件控制类的角色。

应用程序生命周期

作为应用程序的委托对象,AppDelegate类在应用程序生命周期的不同阶段会回调不同的方法。首先,让我们先了解iOS应用的不同状态及其彼此间的关系。

  • Not running(非运行状态)。应用没有运行或被系统终止。
  • Inactive(前台非活动状态)。应用正在进入前台状态,但是还不能接受事件处理。
  • Active(前台活动状态)。应用进入前台状态,能接受事件处理。
  • Background(后台状态)。应用进入后台后,依然能够执行代码。如果有可执行的代码,就会执行代码,如果没有可执行的代码或者将可执行的代码执行完毕,应用会马上进入挂起状态。
  • Suspended(挂起状态)。被挂起的应用进入一种"冷冻"状态,不能执行代码。如果系统内存不够,应用会被终止。

在应用状态跃迁的过程中,iOS系统会回调AppDelegate中的一些方法,并且发送一些通知。实际上,在应用的生命周期中用到的方法和通知很多,我们选取几个主要的方法和通知进行纤细介绍。

为了让大家更直观地了解各状态与其相应地方法、通知间地关系,下面我们以几个应用场景为切入点进行系统分析。

非运行状态------应用启动场景

点击Home键------应用退出场景




轻按两下Home键可以快速进入iOS(iOS9及其后续版本)多任务栏,此时可以看到处于后台运行或挂起状态地应用,也可能有处于终止状态地应用。向上滑动应用界面,可以删除这些应用并释放内存。

挂起重新运行场景

内存清除:应用终止场景

应用界面

苹果应用程序的界面几乎都是由Cocoa和Cocoa Touch框架中地类和协议等元素构建的,这些元素通过mvc模式有效地组织起来。

macOS应用的界面主要使用Cocoa框架开发,Cocoa是一种为应用程序提供丰富用户体验的框架,其核心是:Foundation和AppKit框架。iOS应用界面主要使用Cocoa Touch框架开发,核心是:foundation和UIKit框架。Cocoa Touch框架有一套自己的MVC模式,其中视图和控制器是UIKit中的UIView(及其子类)和UIViewController(及其子类)。

视图的生命周期

在应用运行过程中视图会显示不同的状态,这就是视图的生命周期。视图生命周期的不同阶段会回调视图控制器的不同方法。

视图创建并加载到内存中时,会调用viewDidLoad方法,这时视图并未出现。该方法中通常会对所控制的视图进行初始化处理。

视图可见前后会调用:viewWillAppear和viewDidAppear方法,视图不可见前后会调用viewWillDisappear和viewDidDisappear方法。这4个方法调用父类相应的方法以实现其功能,编码时调用父类方法的位置可根据实际情况做调整。

viewDidLoad方法在应用运行的时候只调用一次,二上述4个方法可以被反复调用多次。

视图

在Cocoa Touch框架中,提供了视图的"根"类------UIView。

从继承关系上看,UIView是所有视图的"根"。

其中,比较特殊的类是UIControl类,该类是控制类,它及其子类都能响应一些高级事件(可以通过xcode中的sent events栏来查看控件是否有高级事件)。,除此之外的类都无法响应高级事件。事实上,视图也可以响应事件,但是这些事件比较低级,需要开发人员自己处理。很多手势的开发都以这些低级事件为基础。

  • 视图分类

    1. 控件。继承UIControl类,能够响应用户高级事件。
    2. 窗口。UIWindow对象。一个iOS应用只有一个UIWindow对象(这点和Android就有很大的区别了,Android是一个activity就持有一个window对象,换句话说一个Android应用是有多个window对象的 ),它是所有子视图的"根"容器(这点就和Android一致)。
    3. 容器视图。包括UIScrollView、UIToolbar及它们的子类。
    4. 显示视图。UIImageView、UILabel等。
    5. 文本和web视图。
    6. 导航视图。为用户提供从一个屏幕到另一个屏幕的导航(或跳转)视图,包括UITabBar和UINavigationBar。
    7. 警告框和操作表。用于给用户提供一种反馈或者与用户进行交互。
  • 应用界面构建层次

    iOS应用界面是由若干个视图构建而成的,这些视图对象采用树形构建。下图是一个应用界面的构建层次图,该应用有一个UIWindow,其中包含一个UIView根视图。根视图下又有3个子视图------Button1、Label2和UIView(View2),其中子视图UIView(View2)中存在一个按钮Button3。

    一般情况下,应用中只包含一个UIWindow。从UI构建层次上讲,UIWindow包含一个根视图UIView。根视图一般也只有一个,放于UIWindow中。根视图的类型决定了应用程序的类型。

    应用界面的构建层次是一种树形结构,"树根"是Window,RootView根视图是"树干",其他视图对象为"树冠"。在层次结构中,上下两个视图是"父子关系"。除了Window,每个视图的父视图有且只有一个,子视图可以有多个。它们间的关系涉及3个属性。

  • superview。获得父视图对象。

  • subviews。获得子视图对象集合。

  • window。获得视图所在的界面Window对象。

相关推荐
吴佳浩2 天前
OpenClaw macOS 完整安装与本地模型配置教程(实战版)
人工智能·macos·agent
开心就好20252 天前
iOS App 安全加固流程记录,代码、资源与安装包保护
后端·ios
开心就好20252 天前
iOS App 性能测试工具怎么选?使用克魔助手(Keymob)结合 Instruments 完成
后端·ios
zhongjiahao3 天前
面试常问的 RunLoop,到底在Loop什么?
ios
wvy4 天前
iOS 26手势返回到根页面时TabBar的动效问题
ios
RickeyBoy4 天前
iOS 图片取色完全指南:从像素格式到工程实践
ios
aiopencode5 天前
使用 Ipa Guard 命令行版本将 IPA 混淆接入自动化流程
后端·ios
二流小码农5 天前
鸿蒙开发:路由组件升级,支持页面一键创建
android·ios·harmonyos
vi_h5 天前
在 macOS 上通过 Docker 安装并运行 Ollama(详细可执行教程)
macos·docker·ollama
iceiceiceice6 天前
iOS PDF阅读器段评实现:如何从 PDFSelection 精准还原一个自然段
前端·人工智能·ios