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

iPhone应用程序发布时间、生命周期问题,iphone,Iphone,我正在尝试想出一种方法来确定用户点击应用图标后需要多长时间,应用才能准备好供用户输入 据我所知,我可以插入要运行的代码的第一个地方是main.m中的main()函数,在接受用户输入之前要做的最后一件事是在app委托中调用applicationdifinishLaunching。然而,我发现在应用程序启动后的几秒钟内main()都没有被调用,我也不知道为什么 我对应用程序生命周期的理解正确吗?在生命周期的早期,我是否可以开始测量这些信息?任何人都有解决方案吗?main()应该是首先调用的,但系统可

我正在尝试想出一种方法来确定用户点击应用图标后需要多长时间,应用才能准备好供用户输入

据我所知,我可以插入要运行的代码的第一个地方是main.m中的main()函数,在接受用户输入之前要做的最后一件事是在app委托中调用applicationdifinishLaunching。然而,我发现在应用程序启动后的几秒钟内main()都没有被调用,我也不知道为什么


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

main()应该是首先调用的,但系统可能会首先执行其他操作(加载库和资源、复制内容等)。使用主应用程序IDFinishLaunch:ing measurement,您走在正确的轨道上。

在调用
main
之前,会发生一些事情:

  • 已分配地址空间(用于堆栈、可执行文件等)
  • 已加载可执行文件
  • 进程链接到dyld(动态链接器)
  • 执行马赫头中的加载命令(加载框架和库)
  • 为库的静态存储分配了更多页面
  • dyld执行符号解析
  • 执行库和可执行文件的初始化
这应该只列出在调用main之前发生的一些事情。您可以将代码放在其中一个初始化函数中,以便能够在main之前执行一些操作,但不要指望这会大大减少tap和代码之间的延迟

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

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

如果您需要执行Objective-C操作,可以在您的一个类中实现
+initialize

我猜您在通过Xcode运行应用程序时会看到这种延迟。Xcode必须在后台设置一些东西来获取控制台输出等,这会导致启动时的初始延迟


我的建议是通过在设备上手动启动应用程序来执行应用程序启动计时(从main()到-applicationdFinishLaunching:)。这样做几次,以考虑初始加载工件。如果将结果记录到控制台,则可以使用Xcode管理器获取结果。在用这种方式测试我的应用程序时,我发现启动时间要短得多。

如果没有跳板(只有苹果和越狱手机的用户才能使用跳板),你就无法获得非常精确的启动时间测量。如果您的手机被越狱,您可能可以创建应用程序的调试版本,并使用
time
命令运行它

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