2017-03-07 3 views
2

Ich schreibe ein SIMBL-Plugin für Chrome und erhalte eine bestimmte Instanz mit einem unbelichteten Typ, der in C als NSConcreteValue geschrieben ist. Ich kann es nicht auspacken oder Selektoren darauf ausführen, aber ich kann seinen Typ String mit [myInstance objCType] erhalten.Kann ich NSConcreteValue auf seinen objCType umwandeln?

Der Typ, über den ich spreche, ist GURL. Hier

ist ein Code:

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]); 
} 

Die Registerkarte Titel ist kein Thema, da es eine NSString ist. dieses

[tabUrl objCType] kehrt:

{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 hat eine Eigenschaft namens spec_ den Ich mag würde, um den ASCII-String der GURL Instanz zu erhalten.
Hier ist GURL: https://chromium.googlesource.com/chromium/src/+/lkgr/url/gurl.h

Ist der ObjCType String von irgendeiner Hilfe?

+0

Ich denke nicht, nicht ohne Code zu schreiben, der das C++ ABI kennt. Ich denke, ein besserer Plan, um das zu untersuchen, ist das Kompilieren als ObjC++ und/oder das Erstellen eines ObjC-Wrappers für 'GURL'. –

+0

Danke Josh. Sie sagen also, dass wenn ich als ObjC++ kompiliere, meine Klasse Kenntnisse über die enthaltenen C++ - Typen haben wird? Auf jeden Fall denke ich, dass ich @ @ import-Anweisungen ablegen muss, da beim Speichern als .mm der Fehler "Module sind deaktiviert" beim Kompilieren angezeigt wird. – ohdeerdog

+0

Ich denke schon, aber Sie müssen wahrscheinlich auch die Kopfzeile hinzufügen. Ich wünschte, ich könnte genauer sein: Es ist nicht etwas, was ich tatsächlich gemacht habe, fürchte ich. Aber das ist die Richtung, in die ich schauen würde, wenn ich daran arbeiten würde. –

Antwort

2

NSConcreteValue ist eine private Unterklasse von NSValue.

Ich schlage vor, Sie zu NSValue zu übertragen und dann die öffentliche API NSValue zu verwenden.

Wenn Sie besonders sicher sein wollen, umgeben Sie es mit if ([myObj isKindOfClass:[NSValue class]]) {}.

Betreffend ziehen C++ - Typen von NSValue, this answer zeigt, wie es geht. Im Wesentlichen machen Sie einfach Ihre Variable und rufen Sie dann getValue:&myVar als normal. Sie müssen natürlich als Objective-C++ kompilieren (verwenden Sie eine .mm Erweiterung) und importieren Sie den entsprechenden Header.

Verwandte Themen