分类: iOS平台
2015-08-20 10:04:54
goofyy小编最近暑假在公司一直做thinkPHP后台开发和前台的开发,小编最近也是好少玩swift和ios了。刚把laravel搞完。小编最近也是从一些基础的看起。之前做过笔记,但是逐渐忘记。废话不多说,进入正题
首先像别人一样,小编说一下ios程序的几种状态
ios程序的几种状态
未运行: not running 程序未运行
未激活: inactive 程序已经运行,但是没有接受到事件,通常保持当前状态
激活 : active 程序已经运行,并且接收到了事件,(点击,滑动等等事件)。
后台 : background 程序在后台运行,并且能够执行代码,一般程序在这个状态上停留一段事件,然后就进入挂起状态,但是有一些却是一直执行,例如某些计步软件
挂起 :suspended 程序一直在后台,长期处于background。
挂起 : suspended 这一部分程序比较特殊,程序也是留在内存中,但是不发送通知,内存低的时候,就会被清除。
官网上一幅比较经典的图如下:
简单解释一下吧:程序首先是处在不运行(not runnig)状态,然后,用户点击程序图标,然后进入程序,操作程序进入active。点击home键进入后台,进入挂起状态,这时候如果内存比较低的时候,将会把挂起的程序从内存中清除,当用户又一次点击该程序图标的时候,将会激活程序,让程序从挂起进入acitive状态。
理论说了一大遍。然后我们来具体看一下工程文件。
首先是从程序入口出发,main函数,
#import <UIKit/UIKit.h> #import "AppDelegate.h" int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }首先我们还是从oc程序分析,哈哈。相信这个可以让我们读到更多东西,整个main.m文件只看一句话
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));首先是返回值调用了UIApplicationMain函数,然后调用个几个参数,主要是传AppDelete一个类,看一下AppDelete.m。可以知道AppDelete是一个实现了delegate委托的对象,但是在swift工程当中,main.m被隐藏了,然后我们就可以直接去看AppDelete.swift。简单看一下AppDelete.swift
import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate {这里用一个元数据的方式声明了UIApplicationMain调用了AppDeletegate,而AppDeletegate是UIResponder的一个基类,显然要接受用户的交互响应,同时也实现了UIApplicationDeletegate的接口(协议),而在实现UIApplicationDeltegate协议的时候,使用了UIApplication对象,UIApplication是当前程序的一个实例,然后我们来画图说一下刚刚的关系,有点乱啊。哈哈哈
ok。让我们来结合图说一下,举个例子,有个工匠(Application)做鞋子,做的越来越多,需要雇佣工人,然后,他雇佣了一批工人(Appdelegate)..然后告诉他们做鞋子的流程UIApplicationDelegate,也就是说,UIApplication是应用程序的真正实例,同时有一些委托的具体的协议,而被委托者Appdelegate来实现这些协议。而执行的具体的协议的通用对象是UIApplication。所以程序执行的每一步,具体通用对象UIApplication都可以接受到。
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { return true } func applicationWillResignActive(application: UIApplication) { }
上面就是IOS设计用到的一个委托设计模式。知道了上面的整个过程,就可以看一下程序的整个生命周期了。
启动程序
开始加载程序 -------> willFinishLaunchingWithOptions
程序加载完毕 ------> didFinishLaunchingWithOptions
程序获取焦点 ------->applicationDidBecomeActive
按下Home键
失去焦点 -------->applicationWillResignActive
进入后台 --------->applicationDidEnterBackground
双击Home打开程序
从后台回到前台 ------> applicationWillEnterForeground
获取焦点 ----->applicationDidBecomeActive
内存警告
内存警告 ----->applicationDidReceiveMemoryWaring
退出程序 ------>applicationWillTerminate
给几个官网给的流程图大家可以看一下
程序在前台运行
程序进入后台