NSString 文字放在内存中的什么位置?

iWe*_*Pro 1 memory objective-c string-literals nsstring ios

我为 NSString 做了一个测试。

int a = 10;
NSString *str1 = @"str";
NSString *str2 = [NSString stringWithFormat:@"str"];
NSString *str3 = @"str";
NSString *str4 = @"str2";
NSLog(@"%p %p | 3 %p | 4 %p | a %p", str1,str2,str3,str4,&a);
Run Code Online (Sandbox Code Playgroud)

结果是

0x1286287c8 0xa000000007274733 | 3 0x1286287c8 | 4 0x1286287e8 | a 0x7ffeeb215b14
Run Code Online (Sandbox Code Playgroud)

此测试放置在 iPhone 6s(11.1) 模拟器中。那么str1内存中的位置是什么?它是堆栈还是堆?

CRD*_*CRD 5

请注意,您的好奇值0xa000000007274733奇数- 即设置了最低有效位。对象指针通常是偶数 - 查看您显示的其他指针。

奇值指针是一个指示符,表明它可能是 Apple 的标记指针之一,其中数据直接存储在指针本身中,而不是分配对象。

Unicode 为r0x72,st遵循。所以看起来你有那里的字符的Unicode。

Mike Ash在 2015 年写了一篇关于标记字符串的好文章,尽管您的值似乎与他发现的方案不符。但是,我认为这是某种标记的指针。

HTH

附录

我看到您编辑了问题以询问文字是在堆栈中还是在堆中,这使您意识到您在问str1,哎呀。文字将位于“数据段”中,与代码位于同一内存区域。

要看到这一点,请尝试分配一个通用对象(NSObject可以做,但不是NSString倾向于得到特殊处理的对象)以查看堆对象的位置,并获取 C 函数的地址以查看代码的位置。你可能会发现str1最接近后者。