@UIApplicationMain

因?yàn)?Cocoa 開發(fā)環(huán)境已經(jīng)在新建一個(gè)項(xiàng)目時(shí)幫助我們進(jìn)行很多配置,這導(dǎo)致了不少剛接觸 iOS 的開發(fā)者都存在基礎(chǔ)比較薄弱的問題,其中一個(gè)最顯著的現(xiàn)象就是很多人無法說清一個(gè) app 啟動的流程驾凶。程序到底是怎么開始的,AppDelegate 到底是什么炬藤,xib 或者 storyboard 是怎么被加載到屏幕上的晾捏?這一系列的問題雖然在開發(fā)中我們不會每次都去關(guān)心和自己配置,但是如果能進(jìn)行一些了解的話對于程序各個(gè)部分的職責(zé)的明確會很有幫助穿撮。

在 C 系語言中缺脉,程序的入口都是 main 函數(shù)痪欲。對于一個(gè) Objective-C 的 iOS app 項(xiàng)目,在新建項(xiàng)目時(shí)攻礼, Xcode 將幫我們準(zhǔn)備好一個(gè) main.m 文件业踢,其中就有這個(gè) main 函數(shù):

int main(int argc, char * argv[]) {

? ? ? ? ? ? ? ? @autoreleasepool {

? ? ? ? ? ? ? ? ? ?return UIApplicationMain(argc, argv, nil,NSStringFromClass([AppDelegate class]));

? ? ? ? ? ? ? ? }

}

在這里我們調(diào)用了 UIKit 的 UIApplicationMain 方法。這個(gè)方法將根據(jù)第三個(gè)參數(shù)初始化一個(gè) UIApplication 或其子類的對象并開始接收事件 (在這個(gè)例子中傳入 nil礁扮,意味使用默認(rèn)的 UIApplication)陨亡。最后一個(gè)參數(shù)指定了 AppDelegate 類作為應(yīng)用的委托,它被用來接收類似 didFinishLaunching 或者 didEnterBackground 這樣的與應(yīng)用生命周期相關(guān)的委托方法深员。另外负蠕,雖然這個(gè)方法標(biāo)明為返回一個(gè) int,但是其實(shí)它并不會真正返回倦畅。它會一直存在于內(nèi)存中遮糖,直到用戶或者系統(tǒng)將其強(qiáng)制終止。

了解了這些后叠赐,我們就可以來看看 Swift 的項(xiàng)目中對應(yīng)的情況了欲账。新建一個(gè) Swift 的 iOS app 項(xiàng)目后,我們會發(fā)現(xiàn)所有文件中都沒有一個(gè)像 Objective-C 時(shí)那樣的 main 文件芭概,也不存在 main 函數(shù)赛不。唯一和 main 有關(guān)系的是在默認(rèn)的 AppDelegate 類的聲明上方有一個(gè) @UIApplicationMain 的標(biāo)簽。

不說可能您也已經(jīng)猜到罢洲,這個(gè)標(biāo)簽做的事情就是將被標(biāo)注的類作為委托踢故,去創(chuàng)建一個(gè) UIApplication 并啟動整個(gè)程序。在編譯的時(shí)候惹苗,編譯器將尋找這個(gè)標(biāo)記的類殿较,并自動插入像 main 函數(shù)這樣的模板代碼。我們可以試試看把 @UIApplicationMain 去掉會怎么樣:

Undefined symbols _main

說明找不到 main 函數(shù)了桩蓉。

在一般情況下淋纲,我們并不需要對這個(gè)標(biāo)簽做任何修改,但是當(dāng)我們?nèi)绻胍褂?UIApplication 的子類而不是它本身的話院究,我們就需要對這部分內(nèi)容 “做點(diǎn)手腳” 了洽瞬。

剛才說到,其實(shí) Swift 的 app 也是需要 main 函數(shù)的业汰,只不過默認(rèn)情況下是 @UIApplicationMain 幫助我們自動生成了而已伙窃。和 C 系語言的 main.c 或者 main.m 文件一樣,Swift 項(xiàng)目也可以有一個(gè)名為 main.swift 特殊的文件蔬胯。在這個(gè)文件中对供,我們不需要定義作用域,而可以直接書寫代碼。這個(gè)文件中的代碼將作為 main 函數(shù)來執(zhí)行产场。比如我們在刪除 @UIApplicationMain 后鹅髓,在項(xiàng)目中添加一個(gè) main.swift 文件,然后加上這樣的代碼:

UIApplicationMain(C_ARGC, C_ARGV, nil,NSStringFromClass(AppDelegate))

現(xiàn)在編譯運(yùn)行京景,就不會再出現(xiàn)錯(cuò)誤了窿冯。當(dāng)然,我們還可以通過將第三個(gè)參數(shù)替換成自己的 UIApplication 子類确徙,這樣我們就可以輕易地做一些控制整個(gè)應(yīng)用行為的事情了醒串。比如將 main.swift 的內(nèi)容換成:

import UIKit

class MyApplication: UIApplication {

? ? ? ? ? ?override func sendEvent(event: UIEvent) {

? ? ? ? ? ? ? ? ? super.sendEvent(event)

? ? ? ? ? ? ? ? ?println("Event sent: \(event)");

? ? ? ? }

}

UIApplicationMain(C_ARGC,C_ARGV,NSStringFromClass(MyApplication), NSStringFromClass(AppDelegate))

這樣每次發(fā)送事件 (比如點(diǎn)擊按鈕) 時(shí),我們都可以監(jiān)聽到這個(gè)事件了鄙皇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芜赌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子伴逸,更是在濱河造成了極大的恐慌缠沈,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件错蝴,死亡現(xiàn)場離奇詭異洲愤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)顷锰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門柬赐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人官紫,你說我怎么就攤上這事肛宋。” “怎么了万矾?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵悼吱,是天一觀的道長慎框。 經(jīng)常有香客問我良狈,道長,這世上最難降的妖魔是什么笨枯? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任薪丁,我火速辦了婚禮,結(jié)果婚禮上馅精,老公的妹妹穿的比我還像新娘严嗜。我一直安慰自己,他們只是感情好洲敢,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布漫玄。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪睦优。 梳的紋絲不亂的頭發(fā)上渗常,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機(jī)與錄音汗盘,去河邊找鬼皱碘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛隐孽,可吹牛的內(nèi)容都是我干的癌椿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼菱阵,長吁一口氣:“原來是場噩夢啊……” “哼踢俄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起晴及,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤褪贵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后抗俄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脆丁,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年动雹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了槽卫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胰蝠,死狀恐怖歼培,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情茸塞,我是刑警寧澤躲庄,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站钾虐,受9級特大地震影響噪窘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜效扫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一倔监、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧菌仁,春花似錦浩习、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春疟赊,著一層夾襖步出監(jiān)牢的瞬間辱士,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工听绳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颂碘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓椅挣,卻偏偏與公主長得像头岔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子鼠证,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容