我可以将NSConcreteValue转换为其objCType吗?

时间:2017-03-07 08:41:35

标签: objective-c cocoa chromium objective-c++ simbl

我正在为Chrome编写一个SIMBL插件,而我正在获得一个未曝光类型的特定实例,该实例用C语言编写为NSConcreteValue。我无法打开它或对其执行选择器,但我可以使用[myInstance objCType]获取其类型字符串。

我所说的类型是GURL

以下是一些代码:

NSArray* tabViews = [tabStripController performSelector:@selector(tabViews)];

for (id tabView in tabViews) {

    id tabController = [tabView valueForKey:@"controller_"];

    id tabTitle = [tabController valueForKey:@"toolTip"];

    id tabUrl =  [tabController valueForKey:@"url_"];

    NSLog(@"%@", tabTitle);
    NSLog(@"%s", [tabUrl objCType]);
}

标签标题不是问题,因为它是NSString

[tabUrl objCType]会返回此信息:

{GURL={basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >={__compressed_pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__rep, std::__1::allocator<char> >={__rep=(?={__long=QQ*}{__short=(?=Cc)[23c]}{__raw=[3Q]})}}}B{Parsed={Component=ii}{Component=ii}{Component=ii}{Component=ii}{Component=ii}{Component=ii}{Component=ii}{Component=ii}^{Parsed}}{unique_ptr<GURL, std::__1::default_delete<GURL> >={__compressed_pair<GURL *, std::__1::default_delete<GURL> >=^{GURL}}}}

GURL有一个名为spec_的属性,我想访问该属性以获取GURL实例的ASCII字符串。
这是GURL:https://chromium.googlesource.com/chromium/src/+/lkgr/url/gurl.h

objCType字符串是否有任何帮助?

1 个答案:

答案 0 :(得分:2)

NSConcreteValueNSValue的私有子类。

我建议您转换为NSValue,然后使用NSValue公共API。

如果您想要更加安全,请使用if ([myObj isKindOfClass:[NSValue class]]) {}将其包围。

关于从NSValue中提取C ++类型,this answer显示了如何执行此操作。基本上你只需要制作变量,然后正常调用getValue:&myVar。当然,您必须编译为Objective-C ++(使用.mm扩展名),并导入相关的标题。