Swift中的@UIApplicationMain

1. 程序如何开始的

C 系列语言中,程序的入口都是 main 函数,一个 Objective-C 的 iOS app 项目在新建时,Xcode 会给我们创建好一个 main.m 的文件。

#import 
#import "AppDelegate.h"

int main(int argc, char * argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

main函数中调用了UIKit的UIApplicationMain方法,argc 和argv参数包含了系统带过来的启动时间,这个方法根据第三个参数初始化一个UIApplication或者它的子类对象开始接收事件。当传入nil时则使用默认的UIApplication。最后一个参数指定了AppDelegate类作为应用的委托,用来接收与应用生命周期相关的委托方法。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
}

- (void)applicationWillResignActive:(UIApplication *)application {
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
}

- (void)applicationWillTerminate:(UIApplication *)application {
}

虽然main方法表明要返回一个int,但其实它并不会真正的返回,而是一直存在于内存中,直到用户或者系统将应用强制终止。

2. swift程序是如何开始的

创建一个swift的项目之后,我们发现所有的文件中并没有一个类似于Objective-C中的main.m文件,也没有main函数。唯一和main有关系的就是在AppDelegate中有一个@UIApplicationMain标签。

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

}

这个标签的作用就是将标注的类作为委托,创建一个UIApplication并启动整个程序,一般情况我们不需要对这个标签做任何修改,但如果我们想使用UIApplication的子类而不是它本身,我们就要自定义一个main.swift文件了(记得删除@UIApplicationMain标签)。这个文件我们不需要定义作用域,直接写代码就OK。

import UIKit

class MyApplication: UIApplication {
    override func sendEvent(_ event: UIEvent) {
        super.sendEvent(event)
        print("Event sent:\(event)")
    }
}

UIApplicationMain(
    CommandLine.argc,
    UnsafeMutableRawPointer(CommandLine.unsafeArgv)
        .bindMemory(
            to: UnsafeMutablePointer.self,
            capacity: Int(CommandLine.argc)),
    NSStringFromClass(MyApplication.self),
    NSStringFromClass(AppDelegate.self)
)

这样每次发送事件(点击按钮之类的)我们都可以监听到了。

本文转自:https://www.jianshu.com/p/a526c4d7d61a
参考链接:https://blog.csdn.net/liuhunhun/article/details/8563710

你可能感兴趣的:(Swift中的@UIApplicationMain)