14

我正在使用 cocos2d 框架进行 iOS 游戏开发,我非常羡慕 Eclipse Java 程序员在调试他们的应用程序时能够热交换他们的代码(即在一个方法中更改变量值并让程序实时更新,就好像你无需重新编译即可获得 REPL)。

这似乎对 iOS 开发非常有帮助,我的开发环境(显然)是 Xcode,而我正在使用的编程语言是 Objective C。我在谷歌上搜索过,但找不到任何东西 - 所以我想我会问社区。

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

提前致谢

4

4 回答 4

14

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

正如常见问题解答所说:

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

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

希望能帮助到你!

于 2013-05-09T13:57:33.510 回答
11

用当前的工具是不可能的。

请记住,iOS 应用程序是已签名的——如果您更改单个字节,您将放弃整个事情。可以想象使用运行时对动态添加和删除方法的支持使其工作。但这肯定需要在设备上添加一些额外的东西来支持它,而这是恶意软件可以轻松利用的东西。因此,它可能不是您很快就会看到的功能。

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

于 2012-04-17T17:48:56.243 回答
6

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

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

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

并在 上放置一个断点NSLog,此时您可以要求 lldb 评估 localString 的重新分配作为执行它的一种方式。例如

po localString = @"Hat"

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

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

于 2012-04-17T17:53:20.917 回答
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
于 2016-09-27T04:51:33.087 回答