代码之家  ›  专栏  ›  技术社区  ›  Ben Zotto sberry

在Xcode中调试时智能Obj-C变量内容?

  •  8
  • Ben Zotto sberry  · 技术社区  · 14 年前

    在默认(即我的)配置中,Xcode在调试器窗口中对变量(尤其是那些常见的Objective-C集合)没有什么帮助。

    当我展开某个对象时,调试器似乎通常希望显示底层的Obj-C结构,因此我正在查看 isa

    但我几乎 总是 这里的want是对对象本身有语义意义的东西。例如,对于 NSDictionary ,我希望看到一个键/值的列表。例如,如果这些键和值 NSString s、 我只想看到字符串值,而不是复杂的嵌套对象。同样的道理 NSSet 是的, NSArrays ,以及 NSData s、 虽然通常在摘要列中获取它们的字符串表示形式,但当它们很长时无法查看(例如,路径名太长,无法容纳在列中,似乎无法滚动)--当我双击它时,会得到显示模板字符串,因此我也无法选择/复制它。

    我最近花了很多时间在Eclipse上调试Java,尽管Eclipse有很多错误,但是它知道所有Java集合,并且当您在调试器中找到一个字符串或集合的内容时,它有一个简单的单行转储。

    有办法在Xcode中得到这个吗?我是否遗漏了一些明显的东西,或者我应该跳进显示模板系统?我知道这里有一些支持,因为nsarray似乎得到了一种特殊的listy格式,nsdictionary得到了“2个键/值对”的摘要,等等。

    po 按…行事 提供了我期望从GUI调试器获得的非常有用的输出。这可以在没有上下文切换到控制台的情况下复制吗?

    我非常喜欢Xcode环境,但我一直使用的对象几乎完全不透明,这确实妨碍了调试时间。谢谢。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Basil Bourque    8 年前

    在xcode6中,这个特性似乎已经实现了?当2010年有人问我这个问题时,我不能谈论Xcode的特性

    代码中的 NSString NSNumber NSArray NSDictionary 值,带有断点:

    如果右键单击某个变量并选择“打印变量名称的说明”,则对象的 -debugDescription / -Description 值将打印到控制台。这通常对于更复杂的集合很有用,也许对于long NSString 值等等

    , NSNumber NSArray ,和 NSDictionary 代码中的值,带有断点:

    variables in code

    当断点中断时,您可以在Xcode“变量视图”中看到值。对于集合,您可能需要展开“详细信息”箭头:

    values in the debugger

    "Print Description of variable_name" -debugDescription -description 值将打印到控制台。这通常对于更复杂的集合很有用,而且可能需要很长时间 价值观等。

    Screen shot in Xcode 7 of “Print Description” context-menu item

    printed to the console.

        2
  •  4
  •   Gobra    14 年前

    是的,在调试过程中XCode变量的查找是很弱的,但是它是基于gdb的,你可以在控制台控制它。在调试期间,打开控制台并编写所需的任何命令,以查看NSDictionary*dic;内容很简单

    po dic
    

    采购订单按[obj description]结果打印数据。您还可以调用以下任何方法

    po [dict valueForKey:@"myKey"], or p(NSRect) [[self view] frame]
    

    您可以在gdb帮助中获得更多信息

        3
  •  4
  •   Kendall Helmstetter Gelner    14 年前

    我将查看两个特殊的GDB输出(正如Gobra所指出的),还有显示模板。

    秒:x行:y ":

    Sec:{(int)[$VAR section]}  Row:{(int)[$VAR row]} 
    

    因此,可以打印任何对象类型的描述性文本和多个值。显示变量适用于该类型的所有类,并在XCode运行之间以及在项目之间保持不变。

    最后需要注意的是,对于返回字符串的任何内容,都需要在“{}”对之后添加“:s”,如下所示:

    {[myClass description]}:s
    

    如果需要清除某个显示模板,只需单击该行即可进行编辑并将其全部删除—您将返回默认设置。因此,为任何对象快速创建临时格式化程序非常容易,它可以让您准确地看到感兴趣的内容。