2013-09-21 5 views
1

я застрял при попытке взглянуть на память, используемая NSString:Как найти память, используемую 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" 

Когда рег arding память объекта 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 не является массивом полукокса, и память содержит ... да ... что? Как найти адрес памяти, где хранятся символы, хранящиеся в моей NSString?

+0

NSStrings магазин символов юникода, возможно, именно поэтому память выглядит «странно»? http://blog.ablepear.com/2010/06/objective-c-tuesdays-c-strings.html –

+3

'NSString' определенно не просто массив символов. Это класс String, который поддерживается с помощью CFString. И как вы можете видеть [в исходном коде CFString] (http://opensource.apple.com/source/CF/CF-550.43/CFString.c), есть много всего. –

+0

Итак, NSString - это CFString. Я нашел следующее в файле реализации CFString: 'CF_EXPORT CFStringRef __CFStringMakeConstantString (const char * cStr);/* Частный; не используйте * 'Выглядит хорошо, не так ли? Но как я могу получить доступ к этому указателю через экземпляр NSString? –

ответ

3

Вы спросили:

Как я могу найти адрес памяти, где символы, хранящиеся в моем NSString хранится?

Одним словом, вы не можете. NSString эффективно непрозрачен. Самое близкое, что вы собираетесь получить, - это, вероятно, вызов метода -UTF8String, который даст вам const char*, но если сама строка не закодирована в кодировке UTF8, то этот указатель не будет указывать на «фактические» данные в NSString, поэтому ...

+0

Да, проверка необработанной памяти не найдет данных, она может отображать указатели только на данные или указатели на указатели на данные ... – Sulthan

2

У меня недавно была та же проблема. Вы можете использовать следующую программу, чтобы найти указатель C в памяти NSString.

#import <Foundation/Foundation.h> 

int main(int argc, const char * argv[]) { 
    NSString *[email protected]"@@@@@@@@@@@"; 
    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

+0

Это может привести к конверсии, если это необходимо; нет никаких оснований полагать, что он будет или не будет раскрывать текущее хранилище экземпляров 'NSString'. – Tommy

Смежные вопросы