2017-03-07 63 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擴展名),並導入相關頭文件。

相關問題