在浏览NSString
头文件时,我看到了以下内容。
#define NSMaximumStringLength (INT_MAX-1)
为什么最大字符串长度短于INT_MAX
?这是否适合空终止符(\0
)?相关文章can be found here。
答案 0 :(得分:2)
<强>假设:强>
这是为了容纳
NULL
char:\0
。
<强>文档强>
在Apple文档中找到{{3>} NSMaximumStringLength
NSMaximumStringLength
DECLARED IN foundation/NSString.h
SYNOPSIS NSMaximumStringLength
DESCRIPTION NSMaximumStringLength is the greatest possible length for an NSString.
NSString只是一个“Unicode字符数组” - here
NSString在运行时被__NSCFString
或在编译期间__NSCFConstantString
具体化为Source
__NSCFString
:可能类似于__NSCFConstantString(请参阅下面的记忆调查)。
__NSCFConstantString
:使用char数组分配(const char * cStr) - 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'之后的垃圾,“平均抽奖时间:%g”(又称缓冲过度阅读)。
<强>结论强>
通过推理,我们可以观察到 NSMaximumStringLength 定义中有1 byte
,留给NULL char来确定内存中字符串的结尾。