假设:
这是为了容纳NULL char:\0。
文档:
在 Apple 文档中找到 here 的 NSMaximumStringLength
NSMaximumStringLength
DECLARED IN foundation/NSString.h
SYNOPSIS NSMaximumStringLength
DESCRIPTION NSMaximumStringLength is the greatest possible length for an NSString.
NSString 只是一个“Unicode 字符数组”-Source
NSString 在运行时具体化为__NSCFString或在编译期间具体化为__NSCFConstantString-Source
NSString 的内存调查:
代码
NSString *s1 = @"test";
在 LLDB 运行时中断:
类型:
expr [s1 fileSystemRepresentation]
输出:
$0 = 0x0b92bf70 "test" // Essential memory location and content.
在 LLDB 中查看内存类型:
memory read 0x0b92bf70
输出:
0x0b92bf70: 74 65 73 74 00 00 00 00 00 00 00 00 00 00 00 00 test............
0x0b92bf80: 7c 38 d4 02 72 a2 1b 03 f2 e6 1b 03 71 c5 4a 00 |8..r.......q.J.
*注意最后一个字符 t 之后的空终止。
NULL 终止的测试假设:
在之前的代码中添加了char*:
NSString *s1 = @"test";
char *p = (char*)[s1 cString];
使用 LLDB 分解代码并输入:
expr p[4] = '\1' // Removing NULL char.
现在如果我们用命令打印 NSString:
expr s1
输出:
(NSString *) $0 = 0x002f1534 @"test
Avg Draw Time: %g"
注意 't' 之后的垃圾,“Avg Draw Time: %g”(又名缓冲区过度读取)。
结论
通过推断,我们可以观察到 NSMaximumStringLength 定义中有 1 byte 留给 NULL 字符来确定内存中字符串的结尾。