首先,NSNumber *numero 是“指向 NSNumber 类型的指针”,而 NSNumber 类型是一个 Objective-C 对象。一般来说,除非在文档中特别说明,否则面向对象编程的经验法则是“对象如何选择表示其内部状态的内部细节对于对象实现来说是私有的,应该被视为黑色盒子。” 同样,除非文档说明您可以这样做,否则您不能假设 NSNumber 正在使用 C 原始类型 ofint
来存储int
您给它的值。
以下是您在“幕后”发生的事情的粗略估计appendBytes:numero
:
typedef struct {
Class isa;
double dbl;
long long ll;
} NSNumber;
NSNumber *numero = malloc(sizeof(NSNumber));
memset(numero, 0, sizeof(NSNumber));
numero->isa = objc_getClass("NSNumber");
void *bytes = malloc(1024);
memcpy(bytes, numero, sizeof(numero)); // sizeof(numero) == sizeof(void *)
这使您更清楚地知道,您附加到NSMutableData
对象的是 ever指向data
的内容的前四个字节(对于 Obj-C 中的对象来说,它始终是 objects 类)。我怀疑您“想要”做的是将指针复制到实例化对象(numero 的值),在这种情况下您应该使用. 如果您使用 GC 时使用的缓冲区未被扫描,这将是一个问题(即,GC 系统将不再“看到”对象并回收它,这几乎可以保证以后随机崩溃.)numero
isa
&numero
NSMutableData
希望很明显,即使您将指向实例化NSNumber
对象的指针放入 to data
,该指针也仅在创建它的进程的上下文中有意义。如果您将该指针发送到另一台计算机,则指向该对象的指针甚至更没有意义 - 接收计算机没有(实际的,琐碎的)方法来读取指针在发送计算机中指向的内存。
由于您似乎在这部分过程中遇到问题,让我提出一个建议,它将为您节省无数小时调试一些您一定会遇到的极其困难的实现错误:
放弃尝试在机器之间发送原始二进制数据并在它们之间发送简单的 ASCII/UTF-8 格式信息的整个想法。
如果您认为这会很慢或效率低下,那么我建议您首先使用简化的 ASCII/UTF-8 字符串化版本来启动所有内容。相信我,调试原始二进制数据并不好玩,NSLog(@"I got: %@", dataString)
当你调试不可避免的问题时,这种能力是物超所值的。然后,一旦一切都已经凝固,并且您确信您不需要对需要交换的内容进行任何更改,“移植”(因为没有更好的词)该实现到仅二进制版本当且仅当使用 Shark.app 进行分析将其识别为问题区域。作为参考,这些天我可以scp
在机器之间的文件和饱和传输的千兆链接。 scp
在传输 80MB/秒时,每个字节压缩和加密数据的处理量可能比这种简单的字符串化要多 5000 倍。然而,在现代硬件上,这几乎不足以让我的菜单栏中运行的 CPU 计量器发生变化。