【问题标题】:What type is NSString and how many bytes?NSString 是什么类型,有多少字节?
【发布时间】:2021-12-10 05:39:38
【问题描述】:

我是目标 c 的新手。试图找出 Objective 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


    【解决方案1】:

    字节长度为您提供使用指定编码的文本内容长度。在这种情况下,字符串包含单个字符,在 UTF8 中编码为 1 个字节。

    sizeof 为您提供变量类型的大小,在本例中是指向NSString 的指针。 64 位架构上所有指针的大小为 8 字节。它本质上是存储NSString 数据的内存地址的大小。 sizeof 不是方法,甚至不是函数。是运营商。结果在编译时就知道了。

    换句话说:

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

    2. 在内存的另一个地方,有一个NSString 数据结构,它包含一个指向内容的指针。您可以使用sizeof(NSString) 获取此结构的大小(实际上大小会因具体的NSString 子类而异,例如NSMutableStringNSPlaceholderString 等)。

    3. 你的变量包含一个指向NSString的指针,也就是说,它的大小是sizeof(NSString*),总是8字节。

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

    【讨论】:

    • 所以 NSString 使用内存中的 8 个字节作为变量。使用指定编码的文本内容长度与内存无关?
    • @stefanosn 指向 NSString 的指针使用 8 个字节。这是完全不同的事情。
    • 我已阅读您的更新答案。所以我们总共有 1 个字节的字符串内容和 NSString 指针变量,它的内存地址大小为 8 个字节。那么在内存中我们总共有 9 个字节?抱歉,如果我问的是愚蠢的问题,我只是想弄清楚它是如何工作的......
    • @stefanosn 不,你有一个 8 字节的指针,它是一个内存地址。在该内存地址上有NSString 数据结构(或NSString 的实际子类),其中包含大量数据(例如其类型、引用计数器),并且在该数据之间有指向包含实际数据的内部缓冲区。该缓冲区不必是 UTF8 编码的,它可以比它存储的数据更大,并且在复杂的链接数据结构中实际上可以有多个缓冲区。 NSString 可能不是向您介绍指针的最佳示例。
    • 总内存将至少 sizeof(NSString*) + sizeof(NSString) + 1。其他一切都是实现细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 2018-12-18
    • 2016-05-01
    • 2020-02-25
    • 2010-10-19
    相关资源
    最近更新 更多