1. 程式人生 > >Swift專案的main函式為何消失了?如何把它找出來?

Swift專案的main函式為何消失了?如何把它找出來?

OC專案中的main函式

大家是否發現,以前用OC語言建立的專案,一定會有一個main.m檔案,裡面有一個main函式,在這個函式中喚醒app。如果在app啟動時放置斷點,可以看到應用程式呼叫棧,如下圖
這裡寫圖片描述

main函式作為程式啟動後的第二個函式被呼叫,然後在main函式中再啟動UIApplication,並繫結AppDelegate

Swift專案中的main函式為何隱藏

建立過Swift專案的童鞋應該會發現,專案中沒有一個名為main.swift的檔案,為什麼app的入口沒有了?官方文件的說法是這樣的

In Xcode, Mac templates default to including a “main.swift” file, but for iOS apps the default for new iOS project templates is to add @UIApplicationMain to a regular Swift file. This causes the compiler to synthesize a mainentry point for your iOS app, and eliminates the need for a “main.swift” file.

這段話的意思是,Swift專案中添加了@UIApplicationMain 到swift檔案中,使得編譯器合成了一個app入口,所以不需要main.swift檔案

細心的童鞋會發現AppDelegate檔案中多了個@UIApplicationMain的標誌,啟動app並放置斷點,會發現其實main函式還是存在的
這裡寫圖片描述

可能蘋果認為我們並不需要自行配置app入口,所以乾脆簡化了專案配置,使用更加簡單的方式啟動應用,但有時候我們可能需要自己配置入口,例如我們要建立一個UIApplication的子類時

main.swift

如果你希望通過自行配置入口的方式來建立一個UIApplication子類,那麼就要建立一個main.swift檔案

首先建立一個swift檔案,命名為main
main.swift中程式碼如下

import Foundation
import UIKit

UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(UIApplication), NSStringFromClass(AppDelegate))

這裡把 UIApplication 換成你自定義的 ApplicationProcess 列舉在Xcode6.3以上才定義。如果你正在使用Xcode6.2以下的版本,稍微替換一下UIApplicationMain函式中程式碼

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

寫好main.swift之後,還需要把AppDelegate中的@UIApplicationMain註釋掉或者刪掉
這裡寫圖片描述
重新執行專案,app就能正常啟動了

main函式的引數

以前OC的main函式的argv引數是一個字串指標,打印出來後是應用程式的路徑。swift中main函式的 Process.unsafeArgv 引數變成了一串十六進位制數字,應該也是代表應用程式地址。至於為何要修改成數字,也許這是出於安全性考慮吧