【问题标题】:Hot Code Swapping in Xcode?Xcode 中的热代码交换?
【发布时间】:2012-04-17 17:35:57
【问题描述】:

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

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

有谁知道在使用 Objective C 编程时是否可以在 Xcode 中热交换代码?

提前致谢

【问题讨论】:

  • Xcode 曾经有此功能,但 IIRC 它速度慢且不可靠,人们只是不使用它,因此 Apple 取消了该功能,专注于使调试器更好。
  • 真可惜,您知道提供类似/等效功能的任何调试功能吗?我试图减少更改变量并重建和运行的次数,只是为了查看它是否正确(游戏开发者需要反复试验)
  • 如果它在一个变量中,你可以在调试器中编辑它的值。

标签: objective-c xcode hotswap


【解决方案1】:

有一个很棒的插件允许在实时、工作的应用程序中更改代码。它被称为 InjectionPlugin

如常见问题解答所述:

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

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

希望对你有帮助!

【讨论】:

    【解决方案2】:

    目前的工具无法实现。

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

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

    【讨论】:

    • 这个答案似乎已经过时了。 @bartosz-hernas answer 向我指出似乎是兼容 XCode 7.1 的解决方案:InjectionPlugin
    【解决方案3】:

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

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

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

    po localString = @"Hat"
    

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

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

    【讨论】:

    • 所以你的意思是它可能在 xCode 终端内(如果我使用 lldb 作为编译器 - 目前我正在使用 GDB,但只是因为这是默认设置),但这将涉及 1)要设置的断点,以及 2) 在终端中输入的命令,如果它们解决了问题,则必须手动将其移至实际代码中。我理解正确吗?
    • 我理解您只是询问更改变量值的问题,我认为 gdb 在这方面与 lldb 的工作方式相同。否则我认为你是正确的;据我所知,您无法编辑并继续(根据 Microsoft 术语,以确保我已理解问题)。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2011-02-27
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 2014-02-28
      • 1970-01-01
      • 2016-07-10
      • 1970-01-01
      相关资源
      最近更新 更多