簡體   English   中英

iPhone應用程序啟動時間,生命周期問題

[英]iPhone app launch time, lifecycle question

我正在嘗試提出一種方法,以確定用戶點擊應用程序圖標后需要多長時間才能使應用程序為用戶輸入做好准備。

據我所知,我可以插入要運行的代碼的第一個位置是main.m中的main()函數,在接受用戶輸入之前完成的最后一件事是在應用程序委托中調用applicationDidFinishLaunching。 但是,我發現在應用啟動后幾秒鍾沒有調用main(),並且弄不清原因。

我對應用程序生命周期的理解正確嗎? 在生命周期的早期,我可以開始測量此信息了嗎? 有人有解決辦法嗎?

在調用main之前發生了幾件事:

  • 地址空間已分配(用於堆棧,可執行文件等)
  • 可執行文件已加載
  • 進程鏈接到dyld(動態鏈接器)
  • 執行mach標頭中的加載命令(加載框架和庫)
  • 為靜態存儲庫分配了更多頁面
  • dyld執行符號解析
  • 庫和可執行文件的初始化被執行

這僅應列舉一些在調用main之前發生的事情。 您可以將代碼放在其中一個初始化函數中,以便能夠在main之前做一些事情,但是不要期望這會大大減少tap和代碼之間的延遲。

您可以像這樣在main之前聲明要調用的C函數:

void __attribute__ ((constructor)) my_init(void);

如果您需要做Objective-C的事情,則可以在其中一個類中實現+initialize

main()應該是第一個被調用的東西,但是系統可能首先要做其他事情(加載庫和資源,在周圍復制東西等)。 借助main-to-applicationDidFinishLaunch:ing測量,您處在正確的軌道上。

我猜想通過Xcode運行應用程序時會看到這種延遲。 Xcode必須在后台設置一些內容以獲取控制台輸出等,這會導致啟動時出現初始延遲。

我的建議是通過在設備上手動啟動應用程序來執行應用程序啟動時間(從main()到-applicationDidFinishLaunching :)。 多次執行此操作以解決初始負載問題。 如果將結果記錄到控制台,則可以使用Xcode組織器來獲取它們。 以這種方式測試應用程序時,我看到啟動時間大大縮短。

如果沒有使用SpringBoard(只有Apple和越獄手機的所有者可以使用的東西),您將無法獲得非常精確的啟動時間度量。 如果您的手機越獄了,則可以創建應用程序的調試版本並使用time命令運行它。

另一方面,幾乎所有由程序員控制的啟動時間都發生在main()applicationDidFinishLaunching: 因此,無論如何,這可能是一個不錯的起點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM