我的应用需要花费太多时间才能加载。 所以我在这样的main()函数中放了一个NSLog来测量从第一个开始的加载时间:
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()函数之前发生了什么?
答案 0 :(得分:4)
二进制文件的入口点不是main()
,而是start
。对于使用gcc编译的大多数二进制文件都是如此。如果有static variable constructors in C++或__attribute__((constructor))
attribute或+load
methods的功能,则会在main()
之前运行。
由于动态链接,有些代码甚至会在start
之前运行。 dyld
对此负责。此时填写所有未定义的外部符号。当然,这些库的初始化程序也会执行。
Default.png由SpringBoard显示,不受您的应用控制。因此,在显示Default.png和代码实际运行之间可能存在时间延迟。
然而,这些行动很快。通过附加到远程gdb和Xcode更可能引入延迟。