感谢喵神的《100个Swift开发必备 Tip》 内容参考自 “Tip43 @UIApplicationMain”
- 在C系语言中,程序的入口都是
main
函数,对于熟悉的 OC APP 项目,Xcode自动帮我们新建了一个 main.m 文件,其中就有 main 函数:
int main(int argc, char * argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
======================== 朴实无华的分割线 =====================
- but 在 swift 项目里,不曾找到 main 文件,也没有
main
函数。唯一和 main 有关系的是默认的 APPDelegate 类的申明上方有个 @UIApplicationMain 的标签。 - 猜测:这个标签的作用就是将被标注的类作为委托,去创建一个
UIApplication 并启动应用程序。在编译的时候,编译器将寻找这个标记的类,并自动插入像 main 函数这样的模块代码,从而实现和 OC 类似的效果。
@UIApplicationMain
注释掉@UIApplicationMain标记?
程序编译不通过,直接报错!
Undefined symbols for architecture x86_64:
"_main", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
意思应该是找不到main函数
那么我们可以尝试一下,创建一个main.swift文件,里面写上和OC类似的代码
import UIKit
class MyApplication: UIApplication {
}
UIApplicationMain(Process.argc, Process.unsafeArgv, nil, NSStringFromClass(AppDelegate))
- 此时,如果再打开@UIApplicationMain标记,编译就报错了:
'UIApplicationMain' attribute cannot be used in a module that contains top-level code
一山不能容二虎!呵呵!!!
既然是自己创建的main.swift文件,那么我们可以用它做哪些事情呢?
可以全局监听事件
- UIApplicationMain方法签名如下:
/// This function is called in the main entry point to create the application object and the application delegate and set up the event cycle. Even though an integer return type is specified, this function never returns. When users exits an iOS application by pressing the Home button, the application moves to the background.
///
/// @param argc The count of arguments in argv; this usually is the corresponding parameter to main.
/// @param argv A variable list of arguments; this usually is the corresponding parameter to main.
/// @param principalClassName The name of the UIApplication class or subclass. If you specify nil, UIApplication is assumed.
/// @param delegateClassName designates a subclass of UIApplication, you may designate the subclass as the delegate; the subclass instance receives the application-delegate messages. Specify nil if you load the delegate object from your application’s main nib file.
///
/// @return Even though an integer return type is specified, this function never returns.
public func UIApplicationMain(argc: Int32, _ argv: UnsafeMutablePointer<UnsafeMutablePointer<Int8>>, _ principalClassName: String?, _ delegateClassName: String?) -> Int32
- 第三个参数说明:如果传入nil,则使用UIApplication
那么如果我不传入nil,传入自定义的类MyApplication呢?
- 如果传入自定义的类,那么我们就可以在类中重写父类的方法,做一些拦截性操作,监听某些事件了!
import UIKit
class MyApplication: UIApplication {
override func sendEvent(event: UIEvent) {
super.sendEvent(event)
print("sendEvent")
}
}
// 第三个参数不要传nil
UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(MyApplication), NSStringFromClass(AppDelegate))