在Xcode中热代码交换?

时间:2012-04-17 17:35:57

标签: objective-c xcode hotswap

我正在使用cocos2d框架进行iOS游戏开发,我非常羡慕Eclipse Java程序员在调试应用程序时热插拔代码的能力(即更改方法中的变量值并让程序实时更新好像你有一个REPL而不必重新编译)。

对于iOS开发来说,这似乎是非常有用的东西,我的开发环境(显然)是Xcode,我编程的语言是Objective C.我已经google了但是却找不到什么 - 所以我想我会问社区。

有人知道在Objective C中编程时是否有办法在Xcode中进行热交换代码?

提前致谢

4 个答案:

答案 0 :(得分:13)

有一个很棒的插件可以在实时,有效的APP中更改代码。它被称为 InjectionPlugin

正如常见问题解答所述:

  

它是如何工作的? Objective-C运行时允许您使用bundle将新版本的类加载到应用程序中,即使已经有一个实现链接到应用程序中也是如此。 Swizzling用于加载bundle以切换现有类以使用新实现的方法。这可以重复完成,适用于OSX和iOS应用程序以及iOS设备。

我制作了一些小视频,展示了如何安装和使用此插件 http://nomtek.com/developers/how-to-install-and-use-injection-plugin-for-xcode/

希望它有所帮助!

答案 1 :(得分:11)

使用当前工具无法实现。

请记住,iOS应用程序已签名 - 如果您更改单个字节,则必须重新签名。可以想象使用运行时支持动态添加和删除方法使其工作。但这肯定需要添加一些额外的东西来支持它在设备上,这是恶意软件可以轻易利用的东西。所以它很可能不是你很快就会看到的一个功能。

顺便说一句,Xcode版本1.x-3.x确实有“修复并继续”功能。您可以在调试时进行编辑,使用“修复并继续”命令,然后继续运行更新的代码。我相信它在某些时候被删除了,可能是由于以下几个组合:要求你的项目被配置为使用“零链接”和其他一些东西;不完全可靠;可能不支持iOS;切换到llvm; Xcode 4中的其他变化。也许有一天它会回来 - 如果你想要它回来,提交一个错误 - 但同样,我认为在iOS上支持它将是一个挑战。

答案 2 :(得分:6)

如果您只是在谈论更改变量值,那么您可以通过lldb(或者,可能是)gdb偷偷地实现这一点。假设你有:

- (void)uselessMethod
{
    NSString *localString = @"I'm some local text";

    NSLog(@"%@", localString);
}

并在NSLog上设置一个断点,此时你可以让lldb评估一个localString的重新分配作为执行它的方法。 E.g。

po localString = @"Hat"

如果您继续允许程序执行,您应该会发现重新分配已经停滞。同样,您可以调用任何方法或执行任何其他类型的分配。

我刚刚对Xcode 4.3.2进行了测试。

答案 3 :(得分:1)

您可以通过以下方式在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