Xcode 调试器: 变量的视图值

我在 UITableViewController 中的代码:

delegate.myData = [myData objectAtIndex:indexPath.row];

如何在调试器中查看 delegate.myDataindexPath.row的值?delegate.myData应该是一个数组,indexPath.row应该是一个 int。我只能看到对象 delegateindexPath的内存地址,但是 myDatarow在哪里?

alt text

151281 次浏览

事情有点复杂。这些对象是自定义类或结构,在 Xcode 中查看它们并不像在其他开发环境中那样容易。

如果我是你,我会把你想看到的值记录到 NSLog 中,并附上一些描述。

即:

NSLog(@"Description of object & time: %i", indexPath.row);

Try Run->Show->Expressions

输入数组的名称或任何您想要查找的名称。

看看这个 如何在 Xcode 调试器中查看 NSDictionary 变量的内容?

I also use

po variableName
print variableName

在控制台。

In your case it is possible to execute

print [myData objectAtIndex:indexPath.row]

或者

po [myData objectAtIndex:indexPath.row]

你的困惑源于 声明的属性不是(名称必须与)(实例)变量相同。

表达方式

indexPath.row

相当于

[indexPath row]

还有任务

delegate.myData = [myData objectAtIndex:indexPath.row];

相当于

[delegate setMyData:[myData objectAtIndex:[indexPath row]]];

假设合成特性的标准命名。

此外,delegate可能被声明为 id<SomeProtocol>类型,也就是说,编译器在那时还不能为 delegate提供实际的类型信息,而调试器依赖于在编译时提供的信息。由于 id是泛型类型,所以在 delegate中没有关于实例变量的编译时信息。

这就是为什么你没有看到 myDatarow作为变量的原因。

如果要检查发送 -row-myData的结果,可以使用命令 ppo:

p (NSInteger)[indexPath row]
po [delegate myData]

或使用表达式窗口(例如,如果你知道你的 delegate是实际类型的 MyClass *,你可以添加一个表达式 (MyClass *)delegate,或右键单击 delegate,选择 View Value as…并键入实际类型的 delegate(例如 MyClass *)。

也就是说,我同意调试器可能更有帮助:

  • 可以选择告诉调试器窗口使用执行期型态讯息而不是编译时信息。当然,它会降低调试器的速度,但会提供有用的信息;

  • 声明的属性可以显示在名为 properties 的组中,并允许(可选)直接在调试器窗口中进行检查。这也会减慢调试器的速度,因为需要发送消息/执行一个方法来获取信息,但也会提供有用的信息。

你也可以:

  1. 设置断点以暂停执行。
  2. 对象必须在执行范围内
  3. 将鼠标指针移动到对象或变量上
  4. 将出现一个黄色的工具提示
  5. 将鼠标移到工具提示上
  6. 点击两个上下指向的小箭头
  7. 将弹出一个上下文菜单
  8. 选择“打印描述”,它将执行一个[对象描述]
  9. 该描述将出现在控制台的输出中

恕我直言,有点隐蔽和麻烦..。

我同意其他的海报,Xcode 作为一个开发环境应该包括一个简单的方法来调试变量。好消息,确实有一个!

在搜索并没有找到关于如何在 Xcode 中调试变量的简单答案/教程之后,我开始研究 Xcode 本身,发现这个(至少对我来说)非常有用的发现。

如何在 Xcode 4.6.3中轻松调试变量

In the main screen of Xcode make sure to see the bottom Debug Area by clicking the upper-right corner button showed in the screenshot.

Debug Area button

Debug Area in Xcode 4.6.3

现在设置一个断点-通过单击代码区域的边框,在代码中您希望程序暂停的那一行。

Breakpoint

Now in the Debug Area look for this buttons and click the one in the middle. You will notice your area is now divided in two.

Split Debug Area

Should look like this

现在运行您的应用程序。

在程序执行期间到达第一个断点时,您将在左侧看到该断点处可用的所有变量。

Search Field

可以展开变量的左箭头以获得更详细的信息。甚至可以使用搜索字段隔离所需的变量,并在“单步进入”断点范围时实时查看它的变化。

Step Into

在调试区域的右侧,您可以使用鼠标右键单击所需的变量来发送打印变量。

Contextual Menu

As you can see, that contextual menu is full of very interesting debugging options. Such as 看好了 that has been already suggested with typed commands or even 编辑价值..。 that changes the runtime value of your variable!

可以在运行时将值打印到控制台窗口:

  1. 放置要获取值的断点
  2. 现在执行分步调试。
  3. 将光标放在变量/委托上,该变量/委托的值将在运行时检查。
  4. 现在这将显示变量/委托的描述
  5. 点击“ i”将显示详细描述
  6. 这还将在控制台窗口中打印详细信息。

Screenshot for printing details on console window

在“代码编辑器”下面的“调试”区域中右键单击,然后选择 Add Expression...上下文菜单项。在这里输入变量,例如 delegate.myData,就是这样。