一些背景......我正在编写使用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}}值:
我做错了什么?
答案 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中指向的任何数据。