NSString 是什么类型,有多少字节?

What type is NSString and how many bytes?

提问人:stefanosn 提问时间:10/24/2021 更新时间:10/24/2021 访问量:169

问:

我是目标 c 的新手。试图找出目标 C 中 NSString 的类型。我使用 C 中的 sizeof() 方法和使用 NSString 中的 UTF8 编码的 lengthOfBytesUsingEncoding 方法。

NSString *test=@"a";

NSLog(@"LengthOfBytesUsingEncoding: %lu bytes", [test lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);

printf("NSString: %lu\n", sizeof(test));

这将在控制台中给我

LengthOfBytesUsingEncoding:1 个字节,NSString:8 个字节

这两个结果有什么区别? 为什么 LengthOfBytesUsingEncoding 返回 1 个字节,sizeof 方法返回 8 个字节? NSString 的类型是什么?int、float、long、long double?

iOS Objective-C nsString

评论


答:

2赞 Sulthan 10/24/2021 #1

字节的长度为您提供使用指定编码的文本内容的长度。在本例中,字符串包含一个字符,该字符在 UTF8 中编码为 1 个字节。

为您提供变量类型的大小,在本例中,该类型是指向 的指针。64 位体系结构上所有指针的大小为 8 个字节。它本质上是存储数据的内存地址的大小。 不是一个方法,它甚至不是一个函数。这是一个操作员。结果在编译时是已知的。sizeofNSStringNSStringsizeof

换言之:

  1. 实际的字符串内容以不透明的格式存储在内存中,您不应该感兴趣。

  2. 在内存中的另一个位置,有一个包含指向内容的指针的数据结构。您可以使用以下命令获得此结构的大小(实际上大小会因具体子类而异,例如等)。NSStringsizeof(NSString)NSStringNSMutableStringNSPlaceholderString

  3. 变量包含指向 的指针,即其大小为 ,始终为 8 个字节。NSStringsizeof(NSString*)

sizeof算子不应该让你对 Objective-C 感兴趣,除非你正在处理指针算术,这应该是相当罕见的。

评论

0赞 stefanosn 10/24/2021
因此,NSString 在内存中使用 8 个字节作为变量。使用指定编码的文本内容的长度与内存无关?
0赞 Sulthan 10/24/2021
@stefanosn指向 NSString 的指针使用 8 个字节。这是一件非常不同的事情。
0赞 stefanosn 10/24/2021
我已经阅读了您更新的答案。因此,我们总共有 1 字节的字符串内容和内存地址大小为 8 字节的 NSString 指针变量。那么在内存中,我们总共有 9 个字节?对不起,如果我问一些愚蠢的问题,我只是想弄清楚它是如何工作的......
1赞 Sulthan 10/24/2021
@stefanosn 不,您有一个 8 字节的指针,它是一个内存地址。在该内存地址上有一个数据结构(或实际的子类),其中包含大量数据(例如其类型,引用计数器),并且在该数据之间有指向包含实际数据的内部缓冲区的指针(同样是 8 字节)。该缓冲区不必是 UTF8 编码的,它可以比它存储的数据更大,并且在复杂的链接数据结构中实际上可以有多个缓冲区。 可能不是向您介绍指针的最佳示例。NSStringNSStringNSString
0赞 Sulthan 10/24/2021
总的来说,内存至少是 .其他一切都是实现细节。sizeof(NSString*) + sizeof(NSString) + 1