如何将NSValue转换为NSString

时间:2014-03-04 04:32:48

标签: ios objective-c nsstring nsdata

一些背景......我正在编写使用UIWebView的{​​{1}}通过ObjC-JS桥与javascript交互的代码。这个想法是应用程序的“大脑”在JS中,告诉Objective-C如何表现。这有很多好处,比如减少二进制大小,灵活更新等等。但是,有一种情况是JS需要一些只需要Objective-C的对象(JS指示ObjC何时使用/删除宾语)。这是通过将本机对象放在具有唯一标识符的字典中来完成的,该标识符可以作为字符串传递给JS(通过桥接器)。我的问题源于为所述原生Objective-C对象提供了一个很好的标识符。

因此,我试图将对象的引用转换为没有运气的字符串。这就是我所拥有的:

stringByEvaluatingJavaScriptFromString:

// anObject is a custom class NSValue *handle = [NSValue valueWithPointer:(__bridge const void *)anObject]; NSData *data = [NSData dataWithValue:handle]; NSString *stringHandle = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 函数(taken from this SO post):

dataWithValue:

在调试器中浏览它会显示+ (NSData *)dataWithValue:(NSValue *)value { NSUInteger size; const char* encoding = [value objCType]; NSGetSizeAndAlignment(encoding, &size, NULL); void* ptr = malloc(size); [value getValue:ptr]; NSData* data = [NSData dataWithBytes:ptr length:size]; free(ptr); return data; } 的{​​{1}}值:

enter image description here

我做错了什么?

2 个答案:

答案 0 :(得分:3)

你做错了是试图将地址视为UTF-8编码的字符串。地址 - 或任何其他任意数据块 - 不太可能是有效的UTF-8数据。 (如果是偶然的话,它仍然不是你期望的字符串。)

如果您正在尝试获取包含指针值的字符串,即原始对象的地址,那只是[NSString stringWithFormat:@"%p", anObject];

如果您确实需要从NSValue开始,请将anObject替换为[theValue pointerValue]

如果您想要精美打印任意数据,请参阅How to convert an NSData into an NSString Hex string?

答案 1 :(得分:0)

您可以通过调用NSObject方法“description”来获取字符串表示形式。如果需要,可以覆盖子类中的“description”方法。

指针的NSValue将是一个保存32位指针的4个字节的对象。它不会保存RAM中指向的任何数据。