【发布时间】:2017-03-07 08:41:35
【问题描述】:
我正在为 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 字符串有什么帮助吗?
【问题讨论】:
-
我不这么认为,除非编写具有 C++ ABI 知识的代码。我认为一个更好的调查计划是编译为 ObjC++ 和/或为
GURL制作一个 ObjC 包装器。 -
谢谢乔希。所以你是说如果我编译为 ObjC++ 我的类将了解包含的 C++ 类型?无论如何,我认为我必须删除
@import语句,因为当我保存为 .mm 时,编译时出现“模块已禁用”错误。 -
我认为是这样,但您可能也必须包含标题。希望我能更具体一点:恐怕这不是我实际做过的事情。但如果我在做这件事,这就是我要研究的方向。
-
呃。如果我这样做,我会掉进兔子洞。
gurl.h有大量其他 C++ 依赖项。谢谢! -
当然;祝你好运。这里还有其他人实际上在做 ObjC++,希望他们中的一个会来。实际上,您可能想要添加 [objective-c++] 标签。还有[simbl],也许吧?
标签: objective-c cocoa chromium objective-c++ simbl