swift 中的 @UIApplicationMain

作者: Inlight先森 | 来源:发表于2017-12-25 12:09 被阅读111次

    程序如何开始的

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

    #import <UIKit/UIKit.h>
    #import "AppDelegate.h"
    
    int main(int argc, char * argv[])
    {
        @autoreleasepool {
            return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
        }
    }
    

    我们调用了 UIKit 的 UIApplicationMain 方法,这个方法根据第三个参数初始化一个 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 {
    }
    

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

    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<Int8>.self,
                capacity: Int(CommandLine.argc)),
        NSStringFromClass(MyApplication.self),
        NSStringFromClass(AppDelegate.self)
    )
    

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

    相关链接

    相关文章

      网友评论

        本文标题:swift 中的 @UIApplicationMain

        本文链接:https://www.haomeiwen.com/subject/rfklgxtx.html