【问题标题】:Can I cast a NSConcreteValue to its objCType?我可以将 NSConcreteValue 转换为它的 objCType 吗?
【发布时间】: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


【解决方案1】:

NSConcreteValueNSValue 的私​​有子类。

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

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

关于从NSValue 中提取 C++ 类型,this answer 显示了如何做到这一点。本质上,您只需创建变量,然后像往常一样调用getValue:&amp;myVar。当然,您必须编译为 Objective-C++(使用 .mm 扩展名),并导入相关的标头。

【讨论】:

    猜你喜欢
    • 2020-06-30
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    相关资源
    最近更新 更多