版本记录
版本号 | 时间 |
---|---|
V1.0 | 2018.06.05 |
前言
我们在做一个APP时候需要注意哪些方面呢,接下来我们就看一下APP编程指南。里面有些可能大家在平时编程中都经历过,但是再系统的了解下也不是坏事。感兴趣的可以看上面写的几篇。
1. APP编程指南 (一) —— 基本概览(一)
2. APP编程指南 (二) —— 应用程序必须实现的行为(一)
3. APP编程指南 (三) —— 应用程序的后台执行(一)
4. APP编程指南 (四) —— 处理应用程序状态转换的策略(一)
5. APP编程指南 (五) —— 实现特定应用程序功能的策略(一)
6. APP编程指南 (六) —— 应用程序间通信(一)
7. APP编程指南 (七) —— 关于性能的几点提示(一)
The App Life Cycle - App生命周期
应用程序是您的自定义代码和系统框架之间复杂的相互作用。 系统框架提供了所有应用程序需要运行的基本基础架构,并提供了定制基础架构所需的代码,并为应用程序提供所需的外观和感觉。 为了有效地做到这一点,理解一些关于iOS结构以及它的工作方式将有助于你的理解。
iOS框架在其实现中依赖于设计模式,例如模型视图控制器MVC和代理。 了解这些设计模式对于成功创建应用程序至关重要。 熟悉Objective-C语言及其功能也会有所帮助。 如果您不熟悉iOS编程,请阅读Start Developing iOS Apps (Swift),以获取有关iOS应用程序和Objective-C语言的介绍。
The Main Function - Main函数
每个基于C的应用程序的入口点都是main函数,iOS应用程序也不例外。 不同的是,iOS应用程序不需要自己编写main函数。 相反,Xcode创建这个函数作为你的基本项目的一部分。 Listing 2-1
显示了这个函数的一个例子。 除了少数例外,你绝不应该改变Xcode提供的主函数的实现。
Listing 2-1 The main function of an iOS app
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
关于main函数唯一要提及的是它的工作是将控制交给UIKit框架。 UIApplicationMain函数通过创建应用程序的核心对象,从可用的故事板文件加载您的应用程序的用户界面,调用您的自定义代码,以便您有机会进行一些初始设置,并将应用程序的运行循环启用。 唯一必须提供的是storyboard
文件和自定义初始化代码。
The Structure of an App - App结构
在启动过程中,UIApplicationMain函数设置了几个关键对象并启动应用程序运行。 每个iOS应用程序的核心都是UIApplication对象,其工作是促进系统和应用程序中其他对象之间的交互。 图2-1显示了大多数应用程序中常见的对象,而表2-1列出了每个对象所扮演的角色。 首先要注意的是iOS应用程序使用模型 - 视图 - 控制器(MVC)体系结构。 这种模式将应用程序的数据和业务逻辑从数据的可视化表示中分离出来。 此架构对于创建可在不同屏幕尺寸的不同设备上运行的应用程序至关重要。
Table 2-1 The role of objects in an iOS app
对象 | 描述 |
---|---|
UIApplication对象 |
UIApplication 对象管理事件循环和其他高级应用程序行为。 它还将关键应用程序转换和一些特殊事件(例如传入推送通知)报告给其代理,该代理是您定义的自定义对象。 按原样使用UIApplication 对象 - 即不使用子类。 |
App delegate对象 |
app delegate 是您自定义代码的核心。 该对象与UIApplication 对象协同工作来处理应用程序初始化,状态转换和许多高级应用程序事件。 这个对象也是唯一保证存在于每个应用程序中的对象,所以它经常用来设置应用程序的初始数据结构。 |
文档和数据模型对象 | 数据模型对象存储您的应用程序的内容并且特定于您的应用程序。 例如,银行应用程序可能会存储包含金融交易的数据库,而绘画应用程序可能会存储图像对象,甚至可能存储导致创建该图像的绘图命令序列。 (在后一种情况下,图像对象仍然是数据对象,因为它只是图像数据的容器。)。应用程序还可以使用文档对象(UIDocument的自定义子类)来管理其部分或全部数据模型对象。 文档对象不是必需的,但提供了一种便捷的方法来归类属于单个文件或文件包中的数据。 有关文档的更多信息,请参阅适用于iOS的基于文档的应用程序编程指南。 |
View controller 对象 | 视图控制器对象管理屏幕上应用内容的呈现。 视图控制器管理单个视图及其子视图的集合。 呈现时,视图控制器通过将它们安装在应用程序的窗口中来使其视图可见。UIViewController 类是所有视图控制器对象的基类。 它提供了加载视图,呈现视图,响应设备旋转旋转它们以及其他几种标准系统行为的默认功能。 UIKit和其他框架定义了额外的视图控制器类来实现标准系统接口,如图像选择器,标签栏界面和导航界面。有关如何使用视图控制器的详细信息,请参阅View Controller Programming Guide for iOS。 |
UIWindow对象 | UIWindow对象在屏幕上协调一个或多个视图的呈现。 大多数应用程序只有一个窗口,它在主屏幕上显示内容,但应用程序可能会在外部显示器上显示内容的附加窗口。要更改应用的内容,请使用视图控制器来更改相应窗口中显示的视图。 你永远不要更换窗户本身。除了hosting 视图之外,Windows还可以与UIApplication 对象一起将事件传递到视图和视图控制器。 |
View对象,control对象和layer对象 | 视图和控件提供了应用内容的可视化表示。 view是在指定的矩形区域绘制内容并响应该区域内的事件的对象。 control是一种专门的视图类型,负责实现熟悉的界面对象,如按钮, text fields 和切换switch 。UIKit框架提供了显示许多不同类型内容的标准视图。 您也可以直接通过继承UIView (或其子类)来定义自己的自定义视图。除了结合视图和控件外,应用程序还可以将Core Animation 图层合并到其view和control层次结构中。 layer对象实际上是表示可视内容的数据对象。 视图在后台密集使用图层对象来呈现其内容。 您还可以将自定义图层对象添加到您的界面以实现复杂的动画和其他类型的复杂视觉效果。 |
一个iOS应用与另一个iOS应用的区别在于它管理的数据(以及相应的业务逻辑)以及它如何将该数据呈现给用户。 大多数与UIKit对象的交互不会定义您的应用,但可以帮助您优化其行为。 例如,您的app delegate
的方法可让您知道应用程序何时更改状态,以便您的自定义代码可以做出适当的响应。
The Main Run Loop - 主运行循环
应用程序的主运行循环处理所有与用户相关的事件。 UIApplication
对象在启动时设置主运行循环,并使用它来处理事件并处理基于视图的界面的更新。顾名思义,主运行循环在应用程序的主线程上执行。此行为可确保用户相关事件按其接收顺序连续处理。
图2-2显示了主运行循环的体系结构以及用户事件如何导致应用程序执行的操作。当用户与设备交互时,与这些交互相关的事件由系统生成并通过UIKit设置的特殊端口传送到应用程序。事件由应用程序在内部排队,并逐个派发到主运行循环执行。 UIApplication对象是第一个接收事件并对需要做什么做出决定的对象。触摸事件通常分派给主窗口对象,然后将其分派到发生触摸的视图。其他事件可能通过各种应用程序对象略有不同的路径。
iOS应用可以传递多种类型的事件。 最常见的是表2-2。 许多这些事件类型都是使用应用程序的主运行循环传递的,但有些不是。 一些事件被发送到代理对象或传递给您提供的块。 有关如何处理大多数类型的事件(包括触摸,远程控制,动作,加速度计和陀螺事件)的信息,请参阅Event Handling Guide for iOS
。
Table 2-2 Common types of events for iOS apps
事件类型 | 传递到... | 注意 |
---|---|---|
Touch | 事件发生的视图view对象 | Views视图是响应者对象。 任何未被视图处理的触摸事件都会沿着响应器链向下转发以进行处理。 |
Remote control | ||
Shake motion events(远程控制、震动,移动事件) | First responder object(第一响应者) | 远程控制事件用于控制媒体播放,并由耳机和其他附件生成。 |
Accelerometer Magnetometer Gyroscope(加速度计、磁力仪、陀螺仪) | The object you designate您指定的对象 | 与加速计,磁力计和陀螺仪硬件相关的事件被传送到您指定的对象 |
Location 定位 | The object you designate您指定的对象 | 您注册以使用Core Location 框架接收位置事件。 有关使用Core Location 的更多信息,请参阅Location and Maps Programming Guide。 |
Redraw 重绘 | 需要更新的视图 | 重绘事件不涉及事件对象,而只是调用视图来绘制自己。 iOS的绘图体系结构在Drawing and Printing Guide for iOS中进行了描述。 |
某些事件(如触摸和远程控制事件)由应用程序的响应对象处理。 响应者对象在您的应用程序中无处不在。 (UIApplication
对象,视图对象和视图控制器对象都是响应者对象的示例。)大多数事件针对特定响应者对象,但如果需要处理事件,则可以将其传递给其他响应者对象(通过响应者链)。 例如,不处理事件的视图可以将事件传递给它的父视图或视图控制器。
在控件中发生的触摸事件(例如按钮)的处理方式与在许多其他类型视图中发生的触摸事件的处理方式不同。 通常只有有限数量的与控件交互的可能性,因此这些交互被重新打包成动作消息并传递给适当的目标对象。 此目标操作target-action
设计模式可以轻松使用control来触发应用中自定义代码的执行。
Execution States for Apps - 应用程序的执行状态
在任何特定时刻,您的应用程序都位于表2-3中列出的其中一个状态。 系统会响应整个系统发生的操作将您的应用程序从一个状态转移到另一个状态。 例如,当用户按下主页Home按钮时,出现电话呼叫,或发生其他几种中断中的任何一种,当前正在运行的应用程序改变状态作为响应。 Figure 2-3显示了从一个状态转移到另一个状态时应用程序所需的路径。
Table 2-3 App states
状态 | 描述 |
---|---|
Not running 未运行 | 该应用程序尚未启动或正在运行,但被系统终止。 |
Inactive | 该应用程序正在前台运行,但目前没有收到事件。 (尽管如此,它可能正在执行其他代码。)应用程序通常只会暂时保持此状态,因为会转换到其他状态。 |
Active | 该应用程序正在前台运行并正在接收事件。 这是前台应用程序的正常模式。 |
Background | 该应用程序在后台并执行代码。 大多数应用程序会暂时进入此状态,稍后进入暂停状态。 但是,请求额外执行时间的应用可能会保持一段时间。 另外,直接在后台启动的应用程序将进入此状态而不是非活动状态。 有关如何在后台执行代码的信息,请参阅Background Execution。 |
Suspended | 该应用程序在后台,但不执行代码。 系统会自动将应用程序移至此状态,并且在此之前不会通知他们。 暂停时,应用会保留在内存中,但不会执行任何代码。当出现内存不足的情况时,系统可能会在不通知的情况下清除暂停的应用程序,为前台应用程序腾出更多空间。 |
大多数状态转换都伴随着对应用程序代理对象方法的相应调用。这些方法是您以适当的方式对状态变化作出反应的机会。下面列出了这些方法,以及如何使用它们的摘要。
-
application:willFinishLaunchingWithOptions:
- 此方法是您的应用程序在启动时首次执行代码的机会。
-
application:didFinishLaunchingWithOptions:
- 此方法允许您在应用程序显示给用户之前执行任何最终的初始化。
-
- 让您的应用程序知道它即将成为前台应用程序。使用此方法进行最后一分钟的准备。
-
- 让你知道你的应用程序正在从前台应用程序转移。使用此方法将您的应用程序置于静止状态。
-
applicationDidEnterBackground:
- 让您知道您的应用程序现在正在后台运行,并且可能随时暂停。
-
applicationWillEnterForeground:
- 让你知道你的应用正在移出后台并回到前台,但它尚未激活。
-
- 让你知道你的应用程序正在被终止。如果您的应用已被暂停,则不会调用此方法。
App Termination - App终止
应用程序必须随时准备终止,并且不应等到保存用户数据或执行其他关键任务。系统启动的终止是应用程序生命周期的正常组成部分。系统通常会终止应用程序,以便它可以回收内存并为用户启动的其他应用程序腾出空间,但系统也可能会终止错误操作或未及时响应事件的应用程序。
停用的应用在终止时不会收到通知,系统杀死进程并回收相应的内存。如果应用程序当前正在后台运行并且未挂起,系统会在终止之前调用其应用程序委托的applicationWillTerminate:。设备重新引导时,系统不会调用此方法。
除系统终止您的应用程序外,用户还可以使用多任务界面显式终止您的应用程序。用户发起的终止与终止暂停的应用具有相同的效果。应用程序的进程被终止并且没有通知被发送到应用程序。
Threads and Concurrency - 线程和并发
系统创建您的应用的主线程,您可以根据需要创建其他线程来执行其他任务。对于iOS应用程序,首选技术是使用Grand Central Dispatch(GCD)
,操作对象和其他异步编程接口,而不是自己创建和管理线程。像GCD这样的技术可以让你定义你想要做的工作和你想要做的工作的顺序,但让系统决定如何在可用的CPU上执行这个工作。让系统处理线程管理可以简化必须编写的代码,更容易确保代码的正确性,并提供更好的整体性能。
在考虑线程和并发性时,请考虑以下几点:
- 涉及视图,核心动画和许多其他UIKit类的工作通常必须在应用程序的主线程上进行。这条规则有一些例外 - 例如,基于图像的操作通常可能发生在后台线程上 - 但是如果有疑问,假设工作需要在主线程上发生。
- 应该始终在后台线程上执行冗长的任务(或潜在的长度任务)。涉及网络访问,文件访问或大量数据处理的任何任务均应使用GCD或操作对象异步执行。
- 在启动时,尽可能将任务从主线程移出。在启动时,您的应用程序应尽可能快地使用可用的时间来设置其用户界面。只有在主线程上执行有助于设置用户界面的任务。所有其他任务应该异步执行,一旦准备就绪,结果就会显示给用户。
有关使用GCD和操作对象执行任务的更多信息,请参见Concurrency Programming Guide。
后记
本篇主要介绍APP生命周期,感兴趣的给个赞或者关注~~~