【问题标题】:How to find memory used by NSString?如何找到 NSString 使用的内存?
【发布时间】:2013-09-21 21:08:40
【问题描述】:

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

【问题讨论】:

  • NSStrings 以 unicode 存储字符,也许这就是内存看起来“奇怪”的原因? blog.ablepear.com/2010/06/objective-c-tuesdays-c-strings.html
  • NSString 绝对不仅仅是一个字符数组。这是一个使用CFString 备份的字符串类。正如你所看到的in CFString's source code,有很多东西。
  • 所以,NSString 是一个 CFString。我在 CFString 的实现文件中找到了以下内容:CF_EXPORT CFStringRef __CFStringMakeConstantString(const char *cStr);/* Private; do not use * 看起来不错,不是吗?但是如何通过 NSString 实例访问这个指针呢?

标签: iphone ios objective-c xcode macos


【解决方案1】:

你问:

我怎样才能找到存储在我的字符的内存地址 NSString 是否存储?

简而言之,你不能。 NSString 实际上是不透明的。您最接近的可能是在其上调用-UTF8String 方法,这将为您提供const char*,但如果字符串本身未使用UTF8 编码进行本机编码,则该指针将不会指向NSString 中的“实际”数据,所以...

【讨论】:

  • 是的,检查原始内存不会找到数据,它只能显示指向数据的指针,或者指向数据指针的指针......
【解决方案2】:

我最近遇到了同样的问题。您可以使用以下程序查找 NSString 内存中的 C 指针。

#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

【讨论】:

  • 如果需要,这可能会进行转换;没有理由相信它会或不会披露 NSString 的当前实例存储。
【解决方案3】:

我也有同样的问题。我想查看为 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)。这就是我希望找到的答案。

【讨论】:

    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 2013-05-22
    • 2017-06-21
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多