iPhone应用程序发布时间,生命周期问题

时间:2009-11-24 18:54:18

标签: iphone

我正在尝试用一种方法来确定用户点击应用图标后多长时间才能让应用为用户输入做好准备。

据我所知,我可以插入要运行的代码的第一个地方是main.m中的main()函数,并且在接受用户输入之前完成的最后一件事是在app delegate中调用applicationDidFinishLaunching。但是,我发现应用程序启动后几秒钟内没有调用main(),也无法找出原因。

我对应用生命周期的理解是否正确?在生命周期的早期是否有一些地方我可以开始测量这些信息?有人有解决方案吗?

4 个答案:

答案 0 :(得分:7)

调用main之前发生了几件事:

  • 分配地址空间(用于堆栈,可执行文件,......)
  • 已加载可执行文件
  • 进程链接到dyld(动态链接器)
  • 执行mach头中的加载命令(加载框架和库)
  • 为库的静态存储分配了更多页面
  • dyld执行符号解析
  • 执行库和可执行文件的初始化

这应该只列出在调用main之前发生的一些事情。您可以将代码放在其中一个初始化函数中,以便能够在main之前执行一些操作,但不要期望这会减少tap和代码之间的延迟。

您可以在main之前声明要调用的C函数,如下所示:

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

如果你需要做Objective-C的事情,你可以在你的一个班级中实现+initialize

答案 1 :(得分:2)

main()应该是第一个被调用的东西,但系统可能还会先做其他事情(加载库和资源,复制东西等)。你正在使用main-to-applicationDidFinishLaunch正确的轨道:'测量。

答案 2 :(得分:1)

我猜你在通过Xcode运行应用程序时看到了这种延迟。 Xcode必须在幕后设置一些东西以获取控制台输出等,这会在启动时引起初始延迟。

我的建议是通过在设备上手动启动应用程序来执行应用程序启动时间(从main()到-applicationDidFinishLaunching :)。执行此操作几次以考虑初始加载工件。如果将结果记录到控制台,则可以使用Xcode组织器抓取它们。我以这种方式测试我的应用程序时看到了更短的启动时间。

答案 3 :(得分:1)

如果无法访问SpringBoard(仅限Apple和越狱手机的拥有者),您无法获得非常精确的启动时间测量。如果您的手机被越狱,您可以创建应用的调试版本并使用time命令运行它。

另一方面,几乎所有作为程序员控制的启动时间都发生在main()applicationDidFinishLaunching:之间。所以这可能是一个好的开始。