swift在AppDelegate.swift中用標簽@UIApplicationMain
來取代了main函數(shù)钮科,現(xiàn)在可以自己創(chuàng)建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:系統(tǒng)或者用戶傳入的參數(shù)
- argv:系統(tǒng)或用戶傳入的實際參數(shù)
- principalClassName:確定了主要應用程序類的名稱禽额,這個參數(shù)可為nil,這樣UIKit就會使用默認的程序類UIApplication
- delegateClassName:程序自定義的代理類名枯冈,這個類負責系統(tǒng)和代碼之間的交互苹威,一般為AppDelegate昆咽,也可自定義子類。
UIApplicationMain
該部分介紹轉(zhuǎn)自木板釘釘的簡書
不管是通過 main.swift
文件還是 @UIApplicationMain
屬性牙甫,最后都會調(diào)用
UIApplicationMain
函數(shù)掷酗。其實我們的app只做了一件事,就是調(diào)
用 UIApplicationMain
函數(shù)窟哺。讓我們來看看 UIApplicationMain
函數(shù)都做了什么:
1.UIApplicationMain
創(chuàng)建app中的第一個實例泻轰,應用程序?qū)嵗?br>
UIApplication.shared
。 UIApplicationMain
函數(shù)的第三個參數(shù)指定了應用程序?qū)嵗鶎俚念惽夜欤J該參數(shù)是 nil
糕殉,則其默認類就是 UIApplication
亩鬼。如果你想subclass一個UIApplication
殖告, 那就應該將 UIApplicationMain
函數(shù)的第三個參數(shù)指定為你的子類名字阿蝶,例如 NSStringFromClass(MyAppSubclass.self)
.
2.UIApplicationMain
創(chuàng)建app中的第二個實例,app delegate黄绩。UIApplicationMain
函數(shù)的第四個參數(shù)指定了app delegate所屬的類羡洁,
NSStringFromClass(AppDelegate.self)
。如果使用 @UIApplicationMain
屬性爽丹,該屬性默認附加在 AppDelegate
類的聲明中筑煮,其意義與UIApplicationMain
函數(shù)一樣。
3.如果 Info.plist
文件指定了一個main storyboard粤蝎, UIApplicationMain
函數(shù)就載入storyboard并找到其中的initial view controller(或者說是storyboard的入口點)真仲,并實例化該view controller,這是創(chuàng)建的第三個實例初澎。對于Single View app模版秸应,這個實例就是 ViewController
類的實例,該類定義在 ViewController.swift
中碑宴。
4.如果存在main.storyboard
文件软啼,UIApplicationMain
函數(shù)現(xiàn)在就該創(chuàng)建應用程序的window
了,這是app中的第四個實例延柠,一個UIWindow
類的實例(或者在AppDelegate
中祸挪,可以替換為一個UIWindow子類的實例)。創(chuàng)建window實例后贞间,將其指定為AppDelegate
的 window
屬性贿条,同時,將initial view controller
實例的指定為window
實例的 rootViewController
屬性增热。
5.UIApplicationMain
現(xiàn)在開始處理AppDelegate
實例并調(diào)用它的一些方法整以,如 application(_:didFinishLaunchingWithOptions:)
, 在該方法中钓葫,我們可以加入自己的代碼進行一些初始化的設定悄蕾,但不要進行一些比較耗時的工作,因為在這個時候础浮,我們的app界面還沒有顯示出來帆调。
6.如果存在main.storyboard
文件, UIApplicationMain
函數(shù)開始調(diào)用UIWindow
的實例方法 makeKeyAndVisible
豆同,這樣app界面就顯示出來了番刊。
7.在window
顯示的過程中,將獲取root view controller
的main view
影锈, 如果view controller
的view
是通過storyboard
或xib
文件獲取的芹务,那么該nib
文件會被加載蝉绷。nib
文件中的實例化并初始化,并稱為初始界面的對象枣抱,view
及其subview
將被放置在window
中熔吗。view controller
的 viewDidLoad
方法被調(diào)用,在這里可以寫一些自己的代碼佳晶。
應用程序現(xiàn)在已經(jīng)啟動完成并開始運行桅狠,UIApplicationMain
函數(shù)仍然運行而且永不return
,它繼續(xù)監(jiān)視用戶行為轿秧,管理event loop
等中跌。