swift项目中的main函数

作者: BetterComingDay | 来源:发表于2017-01-03 09:40 被阅读259次

    swift在AppDelegate.swift中用标签@UIApplicationMain来取代了main函数,现在可以自己创建main.swift来当做程序的入口,这时候要将标签@UIApplicationMain注释,main.swift代码如下

    import UIKit
    
    UIApplicationMain(CommandLine.argc,
                      UnsafeMutableRawPointer(CommandLine.unsafeArgv).bindMemory(to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc)),
                      nil,
                      NSStringFromClass(AppDelegate.self))
    

    方法讲解

    public func UIApplicationMain(_ argc: Int32, 
                  _ argv: UnsafeMutablePointer<UnsafeMutablePointer<Int8>>!, 
                  _ principalClassName: String?,
                  _ delegateClassName: String?) -> Int32
    
    • argc:系统或者用户传入的参数
    • argv:系统或用户传入的实际参数
    • principalClassName:确定了主要应用程序类的名称,这个参数可为nil,这样UIKit就会使用默认的程序类UIApplication
    • delegateClassName:程序自定义的代理类名,这个类负责系统和代码之间的交互,一般为AppDelegate,也可自定义子类。
    UIApplicationMain

    该部分介绍转自木板钉钉的简书
    不管是通过 main.swift 文件还是 @UIApplicationMain 属性,最后都会调用
    UIApplicationMain 函数。其实我们的app只做了一件事,就是调
    UIApplicationMain 函数。让我们来看看 UIApplicationMain 函数都做了什么:
    1.UIApplicationMain 创建app中的第一个实例,应用程序实例,
    UIApplication.sharedUIApplicationMain 函数的第三个参数指定了应用程序实例所属的类,默认该参数是 nil ,则其默认类就是 UIApplication。如果你想subclass一个UIApplication, 那就应该将 UIApplicationMain 函数的第三个参数指定为你的子类名字,例如 NSStringFromClass(MyAppSubclass.self) .

    2.UIApplicationMain 创建app中的第二个实例,app delegate。UIApplicationMain 函数的第四个参数指定了app delegate所属的类,
    NSStringFromClass(AppDelegate.self) 。如果使用 @UIApplicationMain 属性,该属性默认附加在 AppDelegate 类的声明中,其意义与UIApplicationMain 函数一样。

    3.如果 Info.plist 文件指定了一个main storyboard, UIApplicationMain 函数就载入storyboard并找到其中的initial view controller(或者说是storyboard的入口点),并实例化该view controller,这是创建的第三个实例。对于Single View app模版,这个实例就是 ViewController 类的实例,该类定义在 ViewController.swift 中。

    4.如果存在main.storyboard文件,UIApplicationMain 函数现在就该创建应用程序的window了,这是app中的第四个实例,一个UIWindow类的实例(或者在AppDelegate中,可以替换为一个UIWindow子类的实例)。创建window实例后,将其指定为AppDelegatewindow 属性,同时,将initial view controller实例的指定为window实例的 rootViewController属性。

    5.UIApplicationMain 现在开始处理AppDelegate实例并调用它的一些方法,如 application(_:didFinishLaunchingWithOptions:), 在该方法中,我们可以加入自己的代码进行一些初始化的设定,但不要进行一些比较耗时的工作,因为在这个时候,我们的app界面还没有显示出来。

    6.如果存在main.storyboard文件, UIApplicationMain 函数开始调用UIWindow的实例方法 makeKeyAndVisible ,这样app界面就显示出来了。

    7.在window显示的过程中,将获取root view controllermain view, 如果view controllerview是通过storyboardxib文件获取的,那么该nib文件会被加载。nib文件中的实例化并初始化,并称为初始界面的对象,view及其subview将被放置在window中。view controllerviewDidLoad 方法被调用,在这里可以写一些自己的代码。

    应用程序现在已经启动完成并开始运行,UIApplicationMain 函数仍然运行而且永不return,它继续监视用户行为,管理event loop等。

    相关文章

      网友评论

        本文标题:swift项目中的main函数

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