首页 > 编程语言 >深度解析iOS应用程序的生命周期

深度解析iOS应用程序的生命周期

时间:2023-06-04 18:32:29浏览次数:52  
标签:main 生命周期 对象 App iOS 应用程序 view View


 

摘要:iOS应用程序一般都是由自己编写的代码和系统框架组成,系统框架提供一些基本infrastructure给App来运行,而开发者则自己编写代码定制App的外观和行为,了解iOS Infrastructure及其如何工作对编写App很有帮助。

iOS应用程序一般都是由自己编写的代码和系统框架(system frameworks)组成,系统框架提供一些基本infrastructure给所有App来运行,而你提供自己编写的代码来定制App的外观和行为。 因此,了解iOS Infrastructure和它们如何工作对编写App是很有帮助的。

Main函数入口

所有基于C编写的App的入口都是main函数,但iOS应用程序有点不同。不同就是你不需要为iOS应用程序而自己编写main函数,当你使用Xcode创建工程的时候就已经提供了。除非一些特殊情况,否则你不应该修改Xcode提供的main函数实现。示例代码如下:




1. #import <UIKit/UIKit.h>
2. #import "AppDelegate.h"
3.   
4. int main(int argc, char
5. {  
6.     @autoreleasepool {  
7. return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));  
8.     }   
9. }


上面实例代码中有一个很重要的函数UIApplicationMain,它主要是创建App的几个核心对象来处理以下过程:

  1. 从可用Storyboard文件加载用户界面;
  2. 调用AppDelegate自定义代码来做一些初始化设置;
  3. 将App放入Main Run Loop环境中来响应和处理与用户交互产生的事件。

应用程序的架构

iOS应用程序都遵循Model-View-Controller的架构,Model负责存储数据和处理业务逻辑,View负责显示数据和与用户交互,Controller是两者的中介,协调Model和View相互协作。它们的通讯规则如下:

1. Controller能够访问Model和View,Model和View不能互相访问。

2. 当View与用户交互产生事件时,使用target-action方式来处理。

3. 当View需要处理一些特殊UI逻辑或获取数据源时,通过delegate或data source方式交给Controller来处理。

4. Model不能直接与Controller通信,当Model有数据更新时,可以通过Notification或KVO (Key Value Observing)来通知Controller更新View。

了解iOS的MVC设计模式之后,我们从下图来了解在MVC模式下iOS应用程序有哪些关键对象以及它们职责主要是什么?

用户与iOS设备交互时产生的事件(Multitouch Events,Motion Event,Remote Control Event)交由UIApplication对象来分发给control objects(UIControl)对应的target objects来处理并且管理整个事件循环,而一些关于App运行时重要事件委托给app delegate来处理。

App delegate对象遵循UIApplicationDelegate协议,响应app运行时重要事件(app启动、app内存不足、app终止、切换到 另一个app、切回app),主要用于app在启动时初始化一些重要数据结构;例如,初始化UIWindow,设置一些属性,为window添加 rootViewController。

View Controller有一个view属性是view层次结构中的根view,你可以添加子view来构建复杂的view;controller有一些 viewDidLoad、viewWillAppear等方法来管理view的生命周期;由于它继承UIResponder,所有还会响应和处理用户事 件。

data model对象主要用来存储数据。例如,饿了么app在搜索切换地址后,有历史记录搜索地址历史,当app下次启动时,读取和显示搜索地址历史。

document对象(继承UIDocument)用来管理一些或所有的data model对象。document对象并不是必须的,但提供一种方便的方式来分组属于单个文件或多个文件的数据。

UIWindow对象位于view层次结构中的最顶层,它充当一个基本容器而不显示内容,如果想显示内容,添加一个content view到window。

它也是继承UIResponder,所以它也是会响应和处理用户事件。

View 对象可以通过addSubview和removeFromSuperview 等方法管理view的层次结构,使用layoutSubviews、layoutIfNeeded和setNeedsLayout等方法布局view的层 次结构,当你发现系统提供view已经满足不了你想要的外观需求时,可以重写drawRect方法或通过layer属性来构造复杂的图形外观和动画。还有 一点,UIView也是继承UIResponder,所以也能够处理用户事件。

Control对象通常就是处理特定类型用户交互的View,常用的有button、switch、text field等。

除了使用View和Control来构建view层次结构来影响app外观之外,还可以使用Core Animation框架的Layer对象来渲染view外观和构建复杂的动画。

Main Run Loop

一 个iOS应用程序的main run loop主要作用是处理所有与用户相关的事件。UIApplication对象在启动时就设置main run loop和使用它来处理事件和更新基于view的界面。正如它的名字显示,main run loop是运行在应用程序的主线程。这样就确保与接收到用户相关的事件被有序地处理。

下图显示main run loop的架构和用户事件最终是怎样被应用程序处理。当用户与设备交互时,系统就会生成与交互关联的事件,然后被应用程序的UIKit通过一个特殊的端口 来分发。应用程序把事件放入队列,然后逐个分发到main run loop来执行。UIApplication对象是第一个对象接收到事件,然后决定怎样处理它。一个touch event通常都被分发到main window对象,然后依次分发到发生触碰的view。其他event的接收事件对象路径可能有点不同。

大 多数的事件通过使用main run loop来分发,但有些不是。有些事件被发送到一个delegate对象或传递到你提供的block中。想了解更多如何处理大多数类型的事件,其中包括 touch、remote control、motion、accelerometer和gyroscopic等事件,请查阅Event Handle Guide for iOS



 

标签:main,生命周期,对象,App,iOS,应用程序,view,View
From: https://blog.51cto.com/u_2700990/6411678

相关文章

  • Spring Bean生命周期之三级缓存循环依赖
    目录1三级缓存1.1引言1.2三级缓存各个存放对象1.3解决循环依赖条件1.3.1解决循环依赖条件1.3.2Sprin中Bean的顺序1.3.3更改加载顺序1.3.3.1构造方法依赖(推荐)1.3.3.2参数注入1.3.3.3@DependsOn(“xxx”)1.3.3.4BeanDefinitionRegistryPostProcessor接口1.3.4执行顺......
  • 【iOS】GitHub上最受欢迎的iOS开源项目(二)
    “每一次的改变总意味着新的开始。”这句话用在iOS上可谓是再合适不过的了。GitHub上的iOS开源项目数不胜数,iOS每一次的改变,总会引发iOS开源项目的演变,从iOS1.x到如今的iOS7,有的项目已经被弃用,即使曾经的它很受开发者喜爱,有的项目则继续发扬光大,新项目更是层出不穷。在本文中,我们......
  • HTTP、WebSocket、gRPC 或 WebRTC:哪种通信协议最适合您的应用程序?
    在为您的应用程序选择通信协议时,有很多不同的选择。在本文中,我们将了解四种流行的解决方案:HTTP、WebSocket、gRPC和WebRTC。我们将通过调查其背后的技术、它的最佳用途及其优缺点来探索每个协议。我们的通信方式在不断改进:变得更快、更方便、更可靠。我们的通信方式已经从使用信鸽......
  • PXE(Preboot eXecution Environment)是一种通过网络引导计算机的协议,可以在没有本地存储
    PXE(PrebooteXecutionEnvironment)是一种通过网络引导计算机的协议,可以在没有本地存储设备或可启动介质的情况下从网络上加载操作系统和应用程序。PXE版本因厂商或标准制定者的不同而有所不同。以下是常见的PXE版本及其大致年代:PXE1.0:最早的PXE版本,于1999年左右推出。PXE2......
  • HTTP Boot(即基于HTTP的引导)是一种网络引导协议,它使用HTTP作为文件传输协议,支持远程引
    HTTPBoot(即基于HTTP的引导)是一种网络引导协议,它使用HTTP作为文件传输协议,支持远程引导、安装和部署操作系统和应用程序。与传统的PXE(PrebooteXecutionEnvironment)方式相比,HTTPBoot具有更高的灵活性、可扩展性和安全性。HTTPBoot可以通过以下步骤实现:启动计算机后,BIOS会向......
  • 【Python】如何在FastAPI中使用UUID标记日志,以跟踪一个请求的完整生命周期
    为什么要使用uuid标记日志?在分布式系统中,一个请求可能会经过多个服务,每个服务都会生成自己的日志。如果我们只使用普通的日志记录,那么很难将这些日志串联在一起,以至难以跟踪一个请求的完整生命周期。如果能够使用uuid标记日志,为每个请求生成一个唯一的uuid,且这个日志可以在不同......
  • 《面试1v1》SpringBean生命周期
    我是javapub,一名Markdown程序员从......
  • 使用ChatGPT、Dall-E和GPT-4构建AI应用程序
    您可以利用AI的力量来提升您的Web开发技能。我们发布了一门课程,教您如何使用ChatGPT、Dall-E和GPT-4构建AI应用程序。本课程旨在让您掌握创建尖端人工智能应用程序的知识和技能。在本课程中,您将利用OpenAIAPI构建三个项目,并探索ChatGPT、Dall-E和革命性的GPT-4......
  • 构建服务器集群感知的 Java 应用程序
    ApacheZooKeeper和LinkedInProjectNorbert在分布式企业Java应用程序中简化服务器组协调服务器集群对于高度可扩展的Java企业级应用程序开发已司空见惯,但是应用程序级别的服务器集群感知目前并不属于JavaEE的一部分。在本文中,MukulGupta和PareshPaladiya向您介......
  • IOS基础-UICollectionView
    资料UICollectionView详解(一)——基本使用自定义UICollectionviewCell简述iOS-自定义UICollectionViewCell注册问题UICollectionView详解:(Header/Footer)iOSUICollectionView中添加边框UICollectionview设置sectionbackground自定义UICollectionReusableViewUICollectionView......