2

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

4

3 回答 3

5

您问:

如何找到存储在我的 NSString 中的字符的内存地址?

简而言之,你不能。NSString 实际上是不透明的。您将获得的最接近的方法可能是调用它的方法,这-UTF8String会给您一个const char*NSString,所以...

于 2013-09-21T23:29:13.510 回答
3

我最近遇到了同样的问题。您可以使用以下程序在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

于 2016-01-06T03:02:59.610 回答
1

我有同样的问题。我想查看为 NSString 存储在内存中的字节(十六进制)。

我从这个字节数组开始:

const char bytes1[7] = { 0x05, 0x31, 0x32, 0x33, 0x34, 0x35, 0x00 }; // \0x512345

在初始化之后放置一个断点nsStrInput- 就像@ipmcc 所说 - 该 UTF8String方法返回一个字符数组指针。

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

于 2020-05-04T10:09:37.633 回答