Swift中的main.swift与@UIApplicationMain

感谢喵神的《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))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 问题 1)柯里化,通过柯里化,改造target-action,因为selector只能使用字符串,在编译时无法发现...
    lanjing阅读 3,484评论 3 19
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,121评论 29 470
  • Swift 介绍 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 ...
    大L君阅读 3,168评论 3 25
  • 计算器屋子实验和中文屋子实验很像。 假设有个盒子,里面有个机器,每次当我输入一些合法数字计算符号,它就会输出一个正...
    你看得见我阅读 487评论 23 4
  • 长安的九月,长青树木春意盎然。陈清和用一把冷水洗去早起的倦意,就像是被大雨冲洗的枫树现在变得精神抖擞。他透过那...
    南蒿阅读 202评论 0 0