2017-03-07 92 views
2

我正在为Chrome编写一个SIMBL插件,我得到一个未暴露类型的特定实例,它以C编写为NSConcreteValue。我不能打开它或在其上执行选择器,但我可以通过[myInstance objCType]获取其类型字符串。我可以将NSConcreteValue转换为它的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字符串?

+0

我不这么认为,并非没有编写具有C++ ABI知识的代码。我认为一个更好的调查计划是编译为ObjC++和/或为'GURL'制作一个ObjC包装器。 –

+0

谢谢乔希。所以你说如果我编译为ObjC++,我的类将拥有包含的C++类型的知识?在任何情况下,我想我必须删除'@ import'语句,因为当我保存为.mm时,编译时会出现'模块被禁用'的错误。 – ohdeerdog

+0

我这么认为,但你可能也必须包含标题。希望我可以更具体一些:恐怕我不是有经验的人。但是如果我正在研究这个问题,那么这就是我所看到的方向。 –

回答

2

NSConcreteValueNSValue的私人小类。

我建议你投到NSValue然后使用NSValue公共API。

如果你想要更安全,请用if ([myObj isKindOfClass:[NSValue class]]) {}环绕它。

关于从NSValuethis answer中提取C++类型显示了如何去做。基本上,你只是让你的变量,然后正常呼叫getValue:&myVar。当然,您将不得不编译为Objective-C++(使用.mm扩展名),并导入相关头文件。

相关问题