我在试图查看NSString使用的内存时遇到了困难:
我的NSString theKey在lldb中显示正常:
(lldb) p *theKey
(NSString) $5 = {
NSObject = {
isa = __NSCFConstantString
}
}
内容可见:
(lldb) po theKey
BBBBBBBBBB
我也得到了NSString对象的内存:
(lldb) fr v
(ViewController *const) self = 0x0897eb10
(SEL) _cmd = "viewDidLoad"
(NSString *) theKey = 0x00004664 @"BBBBBBBBBB"
当考虑NSString对象的内存时,我只得到奇怪的值:
(lldb) memory read 0x00004664
0x00004664: 50 93 87 01 c8 07 00 00 68 37 00 00 0b 00 00 00 P.......h7......
0x00004674: 50 93 87 01 c8 07 00 00 74 37 00 00 0b 00 00 00 P.......t7......
这是一个NSString不是char数组,内存包含......是......什么?如何找到存储在NSString中的字符的存储器地址?
答案 0 :(得分:3)
你问:
总之,你不能。 NSString实际上是不透明的。你最接近的可能是调用它上面的如何找到存储在我的字符中的内存地址 存储NSString?
-UTF8String
方法,它会给你一个const char*
,但是如果字符串本身没有用UTF8编码进行原生编码,那么那个指针就会不要指向NSString中的“实际”数据,所以......
答案 1 :(得分:3)
我最近遇到了同样的问题。您可以使用以下程序查找
内存中的C指针NSString
。
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
NSString *a=@"@@@@@@@@@@@";
const char *ptr = CFStringGetCStringPtr( (__bridge CFStringRef)a,
kCFStringEncodingMacRoman ) ;
puts( ptr ) ; // find ptr
NSLog(@"address:%p",ptr);
NSLog(@"content:%s",ptr);
return 0;
}
我发现解决方案是使用CFStringGetCStringPtr
来查找C指针,然后可以使用它来查找内存中的NSString
。
请参阅:http://opensource.apple.com/source/CF/CF-1153.18/CFString.c
答案 2 :(得分:1)
我有同样的问题。我想查看存储在内存中的NSString字节(以十六进制表示)。
我从这个字节数组开始:
const char bytes1[7] = { 0x05, 0x31, 0x32, 0x33, 0x34, 0x35, 0x00 }; // \0x512345
在nsStrInput
初始化后放置断点-如@ipmcc所说-
UTF8String
方法返回了一个Character数组指针。
(lldb) po [nsStrInput UTF8String]
0x0000000100769138
(lldb) mem read -c10 0x0000000100769138
0x100769138: 05 31 32 33 34 35 00 00 00 00 .12345....
我可以看到我的NSString实例确实保存了不可打印的ASCII
字符(0x05
)。那就是我希望找到的答案。