2010-05-23 46 views
2

我的應用需要花費太多時間來加載。 所以我把的NSLog在main()函數像這樣從第一測量裝載時間:在啓動iPhone應用程序的main()函數之前,系統會做什麼?

int main(int argc, char *argv[]) 
{  
    NSLog(@"main"); 

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    int retVal = UIApplicationMain(argc, argv, nil, nil); 
    [pool release]; 
    return retVal; 
} 

但是,在真正稍後顯示的日誌。 Default.png顯示約5秒鐘,所有加載過程在日誌出現後1〜2秒內完成。

在iPhone應用程序上執行main()函數之前發生了什麼?

回答

4

二進制的入口點不是main(),而是start。大多數使用gcc編譯的二進制文件都是如此。當有static variable constructors in C++或功能__attribute__((constructor)) attribute+load methods時,它們將在main()之前運行。

由於動態鏈接,有些代碼甚至會在start之前運行。 dyld負責這個。所有未定義的外部符號都在此處填入。當然,這些庫的初始化程序將執行。

Default.png由SpringBoard顯示,不受您的應用程序控制。因此可以在Default.png之間出現時間延遲,並且代碼實際上正在運行。

但是,這些操作很快。延遲更可能通過附加到遠程gdb和Xcode引入。

+0

太酷了。謝謝! – Eonil 2010-05-23 12:26:23

相關問題