如何从iPhone应用程序中删除UIApplicationMain?

时间:2010-02-02 21:03:29

标签: iphone uiapplication nsrunloop

我正在尝试将游戏库移植到iPhone上。与SDL不同,此库不完全控制main()函数,它通过快速返回的函数与您自己的代码进行通信。所以,例如,明显的伪代码:

int main() {
  library_init();
  // game init code here
  while(we_have_not_quit_the_game) {
    library_message_loop();
    library_init_render();
    // render stuff
    library_end_render();
    // update game state
  }
  library_shutdown();
}

iPhone使这很困难,因为它要求你调用一个永不返回的UIApplicationMain函数。在library_init();。

之后,我根本无法回到用户代码

我不相信这是必要的 - 有NSRunLoop可以用来处理这些事件。然而,我不知道UIApplicationMain是否做了其他重要的事情。 (请注意,我没有计划使用.nib文件,这是我发现UIApplicationMain唯一的另一件事。)

我有三个我能想到的真实想法,但它们都是一项重大的实施工作,所以我想知道是否有人有这方面的经验,然后我会花一天时间尝试注定的想法。

  • 在Init中,生成一个新线程,在该线程中运行UIApplicationMain。要么跨线程(ugh)传递所有事件,要么只是将UIApplicationMain线程置于休眠状态并在主线程中使用CFRunLoop。我听说UIApplicationMain不喜欢在不同的线程中运行。
  • 完全忽略UIApplicationMain,只需使用NSRunLoop。我是否会错过重要的iPhone设置?谁知道!
  • 使用longjmp()做一些可怕的事情,在安装后跳出UIApplicationMain代码,祈祷它在拆解过程中没有做任何重要事情。

建议?

4 个答案:

答案 0 :(得分:5)

答案 1 :(得分:1)

我知道NSApplicationMain()会读取Info.plist并对应用程序执行操作(比如获取初始nib文件),所以我猜想UIApplicationMain()对iPhone执行相同操作(比如获取初始状态栏)样式,缩放default.png图像等)。这些东西在其他任何地方都没有公开,所以它仍然需要运行它调用的函数才能启动应用程序而不会产生任何副作用。你唯一的赌注是对它们进行逆向工程并复制它们(希望它们所做的任何事情都在公共SDK中)。

答案 2 :(得分:0)

目标是采用那个main()函数并让它在iPhone上不加修改吗?

看起来你不可能完全隔离图书馆的用户思考iPhone平台 - 他们将不得不处理XCode以进行代码签名等等。

鉴于此,告诉用户他们必须将main()函数分解为几个可以从applicationDidFinishLaunching和适当的计时器调用的部分,这似乎不会给任何人带来不便。

答案 3 :(得分:0)

为什么不从UIApplication中开始游戏循环? (是的,你不能在main()中拥有它,但这不重要。)一些代表信息是好的候选人。