启动iPhone应用程序的main()函数之前系统做了什么?

时间:2010-05-23 11:37:52

标签: iphone loading

我的应用需要花费太多时间才能加载。 所以我在这样的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()函数之前发生了什么?

1 个答案:

答案 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更可能引入延迟。