2016-12-28 14 views
1

我正面临一个我不明白的问题。在开始解释它之前,即使我在今年使用Objective-C的Swift项目上工作过,但我对这种语言及其概念还不熟悉。访问NSData字节 - 调试器上的值不一样

所以,有我的问题:我想访问一个NSData对象的字节。我知道有几种方法可以做到这一点:

[data bytes]; 

data.bytes; 

[data getBytes: dest, length: [data length]]; 

但每种方法不返回相同的值作为控制台,当我使用po [data bytes]

你能解释一下为什么会发生这种情况吗?我真的不明白我错过了什么。

谢谢。

回答

2

datadata.bytes是两种完全不同的类型。 dataNSData的实例,而data.bytes是原始指针(const void *)。当在调试器中调用po(简称为“打印对象”)时,它将调用-descriptionNSObject继承的东西,或者只是在不打印值的情况下打印该值。

在这种情况下,由于dataNSData(其中有-description),如果你po data,它调用[data description]并打印的那出结果;因为NSData知道如何很好地格式化它的内容,它会很好地打印。

然而,由于data.bytes是一个void *,没有办法调试器知道如何打印(void *可以指向什么,如何解释这是完全由你),所以它会打印出指针本身。

如果要直接从调试器打印数据,可以告诉它如何解释指针并将其打印出来。如果知道该数据blob是n字节长,则可以运行下面的命令:

p/x *(uint8_t (*)[<n>])data.bytes 

其中<n>被替换的数据(例如uint8_t (*)[8]))的字面长度。 *(uint8_t (*)[<n>])data.bytes告诉调试器将data.bytes重新解释为n字节的数组(给出它的长度以便知道要从内存中读取多少数据),而p/x指示它打印找到的字节的十六进制值。

+1

感谢您的回复,现在已经非常清楚了。但是,当我在控制台中使用命令'po [data bytes]'时,它会打印类似0x14ee2ee8的东西,比方说。 当我使用命令'po bytes',其中bytes是[data bytes]的结果时,它打印出像“3w \ x80 \ x88 \ x17”这样的命令。 “po [data bytes]”返回的值究竟是什么? –

+1

当你在变量'bytes'中存储'[data bytes]'时,'bytes'的类型是什么?你的声明是什么样的? –

+1

'bytes'是一个'const char *'。 –