如何找到NSString使用的内存?

时间:2013-09-21 21:08:41

标签: iphone ios objective-c xcode macos

我在试图查看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中的字符的存储器地址?

3 个答案:

答案 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)。那就是我希望找到的答案。