为什么NSMaximumStringLength不是INT_MAX

时间:2014-05-26 03:44:40

标签: objective-c nsstring int max

在浏览NSString头文件时,我看到了以下内容。

#define NSMaximumStringLength (INT_MAX-1)

为什么最大字符串长度短于INT_MAX ?这是否适合空终止符(\0)?相关文章can be found here

1 个答案:

答案 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来确定内存中字符串的结尾。