- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将游戏库移植到 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();
}
最佳答案
看起来我在这里回答我自己的问题!我不接受我的答案,直到我能够在真实的硬件上测试它并将其放入应用程序商店。也就是说,我会在这里保留我的最新信息,包括哪些选项不起作用。
想法#1 :事实证明,每个 NSRunLoop 都是特定于线程的。如果我在单独的线程中创建 UIApplicationMain,它不会收到任何消息。作为一个副作用,这使得无法确定它何时完成初始化,所以如果它有任何非线程安全的东西,它就不会工作。我也许可以跨线程向它发送一条消息,以确定它何时完成初始化,但现在我称之为死胡同。
想法#2 : UIApplicationMain 做了很多微妙的事情。我不确定它的限制是什么,但是如果不涉及 UIApplicationMain,我就无法进行任何工作。想法#2 是正确的。
想法#3 :接收操作系统信号很重要 - 您需要知道是否有电话覆盖,或者您是否即将退出。最重要的是,一些设置消息对于正确启动应用程序似乎至关重要。如果不在 UIApplicationMain 中,我无法找到任何方法来保持消息的发送。我想出的唯一选项是 NSRunLoop 和 CFRunLoop。没有一个工作 - 消息没有像我想要的那样进入。我可能没有正确使用这些,但无论如何,想法 #3 已经过时了。
全新的疯狂想法#4 :可以在 C/C++ 中使用 setjmp/longjmp 来伪造协程。诀窍是首先将堆栈指针设置为某个不会破坏任何重要内容的值,然后开始您的第二个例程,然后来回跳转,假装您有两个堆栈。如果你的“第二个协程”决定从它的主函数返回,事情会变得有点困惑,但幸运的是, UIApplicationMain 永远不会返回,所以这不是问题。
我不知道是否有办法在真实硬件上显式设置堆栈指针,例如,设置为我动态分配的数据块。幸运的是,没关系。 iPhone 默认有一个 1MB 的堆栈,这足以容纳几个协程。
我目前正在做的是使用 alloca() 将堆栈指针向前推送 768 KB,然后生成 UIApplicationMain,然后使用 setjmp/longjmp 在我的“UI 例程”和“主例程”之间来回弹跳。到目前为止,这是有效的。
注意事项:
关于iphone - 如何从 iPhone 应用程序中删除 UIApplicationMain?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2187684/
函数 UIApplicationMain() 何时被调用?它是在哪里定义的? 最佳答案 它通常在 main.m 中的 main() 函数中调用: int retVal = UIApplicationM
突然间,我的 AppDelegate 中出现了这个错误: 'UIApplicationMain' attribute cannot be used in a module that contains
我决定以编程方式加载我的 View ,所以放置: int ret = UIApplicationMain(argc, argv, nil, nil); 行不通。不过,我确实有一个 ViewContro
我刚刚创建了我的第一个 Swift 项目,在 AppDelegate.swift 中类声明上方有一行 - 为什么它在那里?! ... import UIKit import CoreData @UIA
我搜索了又搜索,尽管有很多关于这个问题的主题,但我找不到任何相关的内容来解决我的问题。如果有人可以看一下: 我正在使用 xcode 4.6 我在 int retVal 的 main.m 文件中收到错误
当我第一次看到 UIApplicationMain我以为是一个类(class),因为名字的首字母是大写的。而在阅读文档时发现它是一个函数。 Apple 必须以类命名风格命名 UIApplication
我不知道我的设置发生了什么变化,但过去是当我的 (Swift) 代码崩溃时,调试器会显示有问题的源代码行。 现在不管问题是什么,调试器只会突出显示 AppDelegate.swift 中定义了 UIA
我需要帮助了解何时使用 @main对比 @uiapplicationmain . 据我所知,@uiapplicationmain是一种更简单的方式来调用 uiapplicationmain(:::)在
我正在尝试将游戏库移植到 iPhone。与 SDL 不同,这个库不会完全控制您的 main() 函数,它通过您自己代码中的快速返回函数进行通信。因此,例如,明显的伪代码: int main() {
代码: int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] ini
我正在使用下一行在 iOS 上实例化我的应用程序并且一切正常,预计我不知道如何传递参数来实例化 MyAppDelegate。 UIApplicationMain(argc, argv, nil, NS
#0 0x0149609b in objc_msgSend () #1 0x06a75960 in ?? () #2 0x0108df9a in _performRunLoopAction ()
我的应用程序在 iOS 10.3.1 设备的 UIApplicationMain 方法上以某种方式崩溃。 It indicates a SIGSEGV: SEGV_ACCERR crash. 这是到目
因此,作为我努力学习 Swift 的一部分,我接触到了 Apple 提供的开源“Adventure”项目(发现 HERE)。 尴尬的是,我没有走得太远就遇到了我的第一个困境。当我尝试编译项目时,出现以
我们最近对其中一款应用程序进行了更新,许多用户告诉我们,他们无法再运行该应用程序,因为它在启动时崩溃了。 我们已经能够通过在设备上构建并运行之前的版本来重现崩溃,然后在同一设备上构建并运行其之上的新版
我试图理解 @UIApplicationMain 的自动魔力以及如何用 Java 可视化 iOS 应用程序的启动: public class UIApplication extends UIRespo
自从我将 Xcode 更新到 6.0.1 并将 iOS SDK 更新到 8.0 后,我的应用程序不再在设备上运行(运行 iOS 8 ofc)。但它在模拟器中完美运行。 在对委托(delegate)进行
当我创建 QtWidgets 应用程序时,选择 iphonesimulator-clang Qt5.3,并在 iOS 模拟器上以 Debug模式运行该应用程序,我收到以下错误。我没有添加任何代码;只需
我是 Xcode 开发的新手,如果这是一个简单的修复,我很抱歉。 重现问题的步骤是 基于MasterDetail模板在Xcode中创建一个新项目 运行这个项目没问题 在部署目标中将“7.0”更改为“6
有人可以解释一下 iOS 应用程序中的执行控制流程吗?我知道 UIApplicationMain 首先从 main 调用。然后呢?我定义的方法和main有什么关系?是完全由事件驱动还是可以有一些结构化
我是一名优秀的程序员,十分优秀!