main 函数是程序的入口
在OC里,main 函数是这样的:
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
main函数中执行了一个UIApplicationMain这个函数(虽然这个方法标明要返回一个 int,但其实它并不会真正的返回,而是一直存在于内存中,直到用户或者系统将应用强制终止。)
int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
各个参数的意思:
- argc 系统传入参数的个数
- agrv 系统传入参数的值列表
- principalClassName表示要创建的应用程序对象(app的象征,该类必须是UIApplication或者它的字类)。如果传nil默认就表示UIApplication类。
- delegateClassName表示 给应用程序指定一个代理对象,该类必须遵守UIApplicationDelegate协议
在应用程序启动,进入runloop并开始接收事件前,UIApplication对象会向其委托发送一个特定的消息,让应用能够完成相应的初始化工作.这个特定的消息就是我们在AppDelegate.m文件中的
application:applicationdidFinishLaunchingWithOptions:.一般而言我们可以在此方法内实现我们需要的初始化功能.
到了Swift ,main 函数就“消失了”,它的存在的形式变成了@UIApplicationMain
/// 这个标签的作用就是将标注的类作为委托,创建一个 UIApplication 并启动整个程序
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
}
当我们有需求,需要自定义一个main 函数的时候,就需要创建一个main.swift 文件
UIApplicationMain(CommandLine.argc, CommandLine.unsafeArgv, NSStringFromClass(CustomApplication.self), NSStringFromClass(AppDelegate.self));
class CustomApplication: UIApplication {
override func sendEvent(_ event: UIEvent) {
// 在这里处理一些统一的逻辑
super.sendEvent(event)
}
override func sendAction(_ action: Selector, to target: Any?, from sender: Any?, for event: UIEvent?) -> Bool {
// 在这里处理一些统一的逻辑, 例如 记录行为日志
return super.sendAction(action, to: target, from: sender, for: event)
}
}
这样在sendEvent 和 sendAction 内部,就可以监听到事件的发送了。
网友评论