Swift-@UIApplicationMain
感谢喵神的《100个Swift开发必备 Tip》内容参考自 “Tip43 @UIApplicationMain”
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函数
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))