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
内存中的位置是什么?它是堆栈还是堆?
请注意,您的好奇值0xa000000007274733
是奇数- 即设置了最低有效位。对象指针通常是偶数 - 查看您显示的其他指针。
奇值指针是一个指示符,表明它可能是 Apple 的标记指针之一,其中数据直接存储在指针本身中,而不是分配对象。
Unicode 为r
0x72,s
并t
遵循。所以看起来你有那里的字符的Unicode。
Mike Ash在 2015 年写了一篇关于标记字符串的好文章,尽管您的值似乎与他发现的方案不符。但是,我认为这是某种标记的指针。
HTH
附录
我看到您编辑了问题以询问文字是在堆栈中还是在堆中,这使您意识到您在问str1
,哎呀。文字将位于“数据段”中,与代码位于同一内存区域。
要看到这一点,请尝试分配一个通用对象(NSObject
可以做,但不是NSString
倾向于得到特殊处理的对象)以查看堆对象的位置,并获取 C 函数的地址以查看代码的位置。你可能会发现str1
最接近后者。
归档时间: |
|
查看次数: |
373 次 |
最近记录: |