浅析——iOS是怎样运行一个应用程序的

当我们的iOS设备运行一个app时,发生了什么?

浅析——iOS是怎样运行一个应用程序的_第1张图片
what happens on iOS

首先,来简单了解一下iOS。

iOS(原名 iPhone OS,自 iOS 4 后改名为 iOS)是苹果公司为移动设备所开发的专有移动操作系统。

历史

2007 年 1 月 9 日,苹果在 2007 Macworld 大会中发表了 iOS ( 当时名为 iPhone OS ),并于同年 6 月 29 日发布了 iOS 的第一个版本。iOS 可以通过 iTunes 对设备进行升级,在 iOS 5 及以上版本中亦可以利用 OTA ( On the Air ) 的方式进行软件更新。iOS 必须要与设备经由苹果服务器进行验证,验证方式可通过 iTunes ( iOS 5 及以上版本亦可通过 iCloud 服务验证 ) 并自动同步。[9]WWDC 2013 中,苹果发布了 iOS 7,彻底更改了用户界面,将原本拟物的风格转变为平面化风格。最初苹果公司并没有给随 iPhone 发行的 iOS 一个独立的称谓,直到 2008 年才取名为 iPhone OS,并在 2010 年 6 月改名为 iOS。

系统架构

  • 框架:iOS 使用基于与苹果麦金塔计算机不同的 ARM 架构的 64 比特或 32 比特之中央处理器,使用由 PowerVR 视频卡渲染的 Metal 以 Darwin 作为基础。
  • 系统架构层次:iOS 分为核心操作系统层(the Core OS layer )、核心服务层(the Core Services layer)、媒体层(the Media layer)及触控应用层(the Cocoa Touch layer)。
  1. 核心操作系统层(Core OS):直接跟硬件交互的,例如内存管理,文件系统等。
  2. 核心服务层(Core Services)=>访问IOS提供的一些服务,例如网络,定位,线程等
  3. 媒体层(Media)=>音频,图像,动画处理等
    可触摸层(Cocoa Touch)=>界面,做IOS开发主要面向Cocoa
  4. Touch层
    Cocoa Touch层中的很多技术都是基于Objective-C的,包括Foundation和UIKit;

言归正传,iOS程序运行原理

  1. 首先执行main函数;
  2. 执行UIApplicationMain函数。第四个参数指定UIApplication的代理,第三个参数指定UIApplication的类名;
  3. UIApplicationMain函数内部
  • 创建一个UIApplication实例。这个UIApplication是一个单例对象,一个UIApplication对象对应一个iOS应用程序;
  • UIApplication对象是应用程序的象征;
  • 开启一个消息循环(main loop);
  • 创建一个UIApplication的delegate对象,负责监听UIApplication的生命周期;
  • 当UIApplication的生命周期发生改变时,会给AppDelegate发送不同的消息。
  • 每一个应用程序都有属于自己的UIWindow,UIWindow继承于UIView。UIView:视图,屏幕上能看得见摸得着的东西都是UIView,比如按钮,标签,文本输入框等。
    UIViewController:内部默认有一个UIView视图,UIViewController负责管理UIView的生命周期、装配数据到UIView上显示,处理UIView事件。UIWindow里面包含状态栏和第一个UIViewController,即rootViewController。

** 这里,有必要对一些重点问题进行说明:**

Run loop

Run loops are part of the fundamental infrastructure associated with threads. A run loop is an event processing loop that you use to schedule work and coordinate the receipt of incoming events. The purpose of a run loop is to keep your thread busy when there is work to do and put your thread to sleep when there is none.
—— Apple Developer

简言之,这是一个线程输入和使用运行事件处理程序响应传入事件的循环。项目中的代码提供了用于执行循环的实际循环部分的控制语句,也即提供了驱动循环的while循环或for循环。在你的循环中,你使用一个运行循环对象来“运行”接收事件的事件处理代码,并调用已安装的处理程序。

关于Run Loop更详细的资料请参考RunLoopManagement和iOS runloop。

UIApplication的生命周期

  • 当第一次运行程序时
    didFinishLaunchingWithOptions:程序加载完毕。
    applicationDidBecomeActive:进入激活状态,可以与用户进行交互。
  • 当点击home键时
    applicationWillResignActive:退出激活状态,不能与用户进行交互。
    applicationDidEnterBackground:进入后台,iOS4之后支持多任务,即程序进入后台之后不会中断。
  • 当再次点击进入程序时
    applicationWillEnterForeground:进入前台。
    applicationDidBecomeActive:已经进入激活状态。**

View 的加载过程

创建控制器后,首先判断控制器是否已经有view了,如果没有,会先调用控制器的loadView方法。然后判断loadView里面是否提供了加载view的方法,如果没有,会加载控制器的storyboard文件。如果storyboard文件也没有可加载的view,就会根据xibName查找对应的xib文件。


浅析——iOS是怎样运行一个应用程序的_第2张图片
View 的加载过程

** 关于UIViewController的生命周期的问题,有很多资料可以参考,在此不作赘述。 **

我们iOS就是这样由我们的代码一步一步地将应用程序所需要的界面和功能展现给用户的。

你可能感兴趣的:(浅析——iOS是怎样运行一个应用程序的)