IOS Swift 一个App的声明周期与启动流程
启动流程
- 首先加载info.plist文件中的配置进行解析
- 创建沙盒,IOS8之后每次生成一个新沙盒
- 加载Mach-O可执行文件,读取dyld路径并运行dyly动态链接器,runtime就是这个时候被初始化的,同时还会加载C函数,Category以及C++静态函数,OC的+load方法,最后dyld返回main函数地址,main函数被调用
+load以及+initialize
1. load方法:
当类被引用进项目的时候就会执行load函数(在main函数开始之前),与这个类是否被用到有关,每个类的load函数只会自动调用一次。由于load函数是系统自动加载的,不需要super load,否则会导致父类的load方法重复调用
注意:
load调用时机比较早,当load调用时,其他类可能还没有加载完成,运行环境不安全。load方法是线程安全的,它使用了锁,我们应该避免线程阻塞在load方法。
load方法的加载顺序:
- 一个类的+load方法在其父类的+load方法之后调用
- 一个Category的+load方法在在被其扩展的类+load方法后调用。当有多个类别(Category)都实现了load方法,这几个load都会执行,但执行顺序不确定(其执行顺序与类别在Compile Sources中出现的顺序一致)
2. initialzie方法:
该方法在类或子类的第一个方法被调用前调用,即类文件被引进项目,但是没有使用,initialize不会被调用
initialize与load方法同为系统自动调用,无需super initialize
initialize方法调用顺序:
- 父类的initialize方法会比子类的initialize方法先执行
- 当子类未实现initialize方法时, 会调用父类initialize方法. 子类实现initialize方法时, 会覆盖父类initialize方法.
- 当有多个Category都实现了initialize方法, 会覆盖类中的方法, 只执行一个(会执行Compile Sources列表中最后一个Category的initialize方法)
main函数
main函数是IOS程序的入口,返回值为int,死循环并不会返回。
UIApplicationMain:
该方法会初始化一个UIApplication实例以及他的代理
- @param argc 参数个数
- @param argv 参数
- @param principalClassName 根据该参数初始化一个UIApplication或其子类,并开始接受事件(传入nil,意味使用默认的UIApplication)
- @param delegateClassName 该参数指定AppDelegate类作为委托类,delegate对象主要是监听,类似于生命周期的回调函数
- @return 返回值为int,但是并不会返回,会一直在内存中,直到程序终止
在swift工程中并没有main函数,但是会发现AppDelegate.swift文件中有一句@UIApplicationMain,这个标签的作用就是将标注的类作为委托,创建UIApplication并启动整个程序
Appdelegate
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
NSLog("开始启动application...")
return true
}
func applicationDidFinishLaunching(_ application: UIApplication) {
NSLog("程序加载完毕")
}
func applicationWillEnterForeground(_ application: UIApplication) {
NSLog("程序从后台进入前台") // app首次启动时不会调用该方法
}
func applicationDidBecomeActive(_ application: UIApplication) {
NSLog("程序获得焦点")
}
func applicationWillResignActive(_ application: UIApplication) {
NSLog("程序失去焦点")
}
func applicationDidEnterBackground(_ application: UIApplication) {
NSLog("程序进入后台")
}
func applicationWillTerminate(_ application: UIApplication) {
NSLog("程序即将退出.")
}
}
操作:程序启动,点击Home键,点击APP
参考链接:https://www.jianshu.com/p/f9a60782f5e1
原编辑时间 2020-12-1
个性签名:时间会解决一切