IOS Swift 一个App的声明周期与启动流程

启动流程

  1. 首先加载info.plist文件中的配置进行解析
  2. 创建沙盒,IOS8之后每次生成一个新沙盒
  3. 加载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方法的加载顺序:

  1. 一个类的+load方法在其父类的+load方法之后调用
  2. 一个Category的+load方法在在被其扩展的类+load方法后调用。当有多个类别(Category)都实现了load方法,这几个load都会执行,但执行顺序不确定(其执行顺序与类别在Compile Sources中出现的顺序一致)

2. initialzie方法:

该方法在类或子类的第一个方法被调用前调用,即类文件被引进项目,但是没有使用,initialize不会被调用

initialize与load方法同为系统自动调用,无需super initialize

initialize方法调用顺序:

  1. 父类的initialize方法会比子类的initialize方法先执行
  2. 当子类未实现initialize方法时, 会调用父类initialize方法. 子类实现initialize方法时, 会覆盖父类initialize方法.
  3. 当有多个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

posted @ 2021-11-24 13:13  Rogn  阅读(428)  评论(0编辑  收藏  举报