我正在使用cocos2d框架进行iOS游戏开发,我非常羡慕Eclipse Java程序员在调试应用程序时热插拔代码的能力(即更改方法中的变量值并让程序实时更新,就好像您有一个REPL而不必重新编译一样)。
当涉及到iOS开发时,这似乎是绝对非常有帮助的,我的开发环境(显然)是Xcode,我正在编程的语言是Objective C。 我已经用谷歌搜索了一下,但找不到任何东西 - 所以我想我会问社区。
有谁知道在Objective C编程时是否有办法在Xcode中热插拔代码?
提前致谢
有一个很棒的插件,允许在实时工作应用程序中更改代码。它被称为InjectionPlugin。
正如常见问题解答所说:
它是如何工作的?Objective-C 运行时允许您使用捆绑包将类的新版本加载到应用程序中,即使已经有一个实现链接到应用程序中。在加载捆绑包时使用重排来切换现有类以使用新实现的方法。这可以重复完成,适用于OSX和iOS应用程序以及iOS设备。
我制作了一些小视频,展示了如何安装和使用此插件http://nomtek.com/developers/how-to-install-and-use-injection-plugin-for-xcode/
希望对您有所帮助!
当前工具无法实现。
请记住,iOS应用程序是经过签名的 - 如果您更改单个字节,您将放弃整个内容。可以想象使用运行时对动态添加和删除方法的支持使其工作。但这肯定需要添加一些额外的东西来支持它在设备上,这是恶意软件可以轻松利用的东西。因此,这可能不是您很快就会看到的功能。
顺便说一下,Xcode 版本 1.x-3.x 确实具有"修复并继续"功能。可以在调试时进行编辑,使用"修复并继续"命令,然后继续运行更新的代码。我相信它在某个时候被删除了,可能是由于以下几种组合:要求将项目配置为使用"零链接",也许还有其他一些事情;不完全可靠;可能不支持 iOS;切换到 LLVM;Xcode 4 中的其他更改。也许有一天它会回来 - 如果你想让它回来,提交一个错误 - 但同样,我认为在iOS上支持它将是一个挑战。
如果您只是在谈论更改变量值,那么您可以通过 lldb(或大概是)gdb 秘密实现。假设您有:
- (void)uselessMethod
{
NSString *localString = @"I'm some local text";
NSLog(@"%@", localString);
}
并在NSLog
上放置一个断点,此时您可以要求 lldb 评估 localString 的重新分配作为执行它的一种手段。
po localString = @"Hat"
如果随后允许程序继续执行,则应发现重新分配已卡住。同样,您可以调用任何方法或执行任何其他类型的赋值。
我刚刚针对 Xcode 4.3.2 对此进行了测试。
您可以通过以下方式热插拔 Xcode 中的变量值:
expression <variable> = <value>;
.
通过在要更改值的位置设置断点并在 Xcode 控制台中执行命令。
例:
// Messages From Console
(lldb) expression graphFlag = @"X"; // Update variable value
(__NSCFConstantString *) $0 = 0x36f95718 @"X" // Xcode prints the updated value
(lldb) expression graphFlag; // Printing value through expression command
(__NSCFConstantString *) $1 = 0x36f95718 @"X" // Hot Swapped variable value