2011-09-16 58 views

回答

3

您可以告訴基本信息,例如它是什麼類型的C,但是您不能區分返回類型上的各種實例類型(或類)。 Objective-C從來沒有設計過,也沒有打算有這樣的反思水平。主要是因爲這樣做會大大增加可執行文件的大小(所有元數據)並支持所有C類型的全參數/返回類型元數據自省 - 認爲C++類型 - 會非常複雜。

在將C++對象傳遞給Objective-C方法時,已經出現過與方法參數化相關的元數據量級大於生成的代碼的情況(字面上 - 元數據的MB值爲a單一方法調用)。


在參數相對簡單的類型的一個例子/返回類型的元數據的形式:

{CGRect={CGPoint=dd}{CGSize=dd}}[email protected]:[email protected]{CGRect={CGPoint=dd}{CGSize=dd}}24{CGRect={CGPoint=dd}{CGSize=dd}}56q88 

而且從WebKit的一個特別突出的例子:

^{文獻=^^ ^^?I^{ContainerNode} {弱=^{JSValue}}^{}文獻^ {}節點^ {}節點^ {渲染對象} I^{}節點^ {}節點^ {TreeScope} {DocumentOrderedMap = {HashMap,WTF :: HashTraits,WTF :: HashTraits

= {哈希表,WTF :: PairFirstExtractor ,WTF :: PtrHash,WTF :: PairHashTraits, WTF :: HashTraits ,WTF :: HashTraits =^{對} IIII}} {HashCountedSet,WTF :: HashTraits = {HashMap中,WTF :: HashTraits,WTF :: HashTraits = {哈希表,WTF :: PairFirstExtractor ,WTF :: PtrHash,WTF :: PairHashTraits, WTF :: HashTraits ,WTF :: HashTraits =^{對} iiii}}}} {DocumentOrderedMap = {HashMap,WTF :: HashTraits,WTF :: HashTraits = {HashTable,WTF :: PairFirstExtractor ,WTF :: PtrHash,WTF :: PairHashTraits, WTF :: HashTraits ,WTF :: HashTraits =^{對} IIII}} {HashCountedSet,WTF :: HashTraits = {HashMap中,WTF :: HashTraits,WTF :: HashTraits = {哈希表,WTF :: PairFirstExtractor ,WTF :: WTF :: HashTraits =^{pair} iiii}}}} WT^:: HashTraits ,{HashSet,WTF :: HashTraits = {HashTable,WTF :: PtrHash,WTF :: HashTraits,WTF :: HashTraits = ^^ {MessagePort} iiii}} {HashMap,WTF :: { HashTraits,WTF :: HashTraits = {HashTable,WTF :: PairFirstExtractor ,WTF :: PtrHash,WTF :: PairHashTraits, WTF :: HashTraits>,WTF :: HashTraits =^{pair} iiii}} BB {HashMap ,WTF :: HashTraits,WTF :: HashTraits = {HashTable,WTF :: PairFirstExtractor>,WTF :: IntHash,WTF :: PairHashTraits, WTF :: HashTraits>,WTF :: HashTraits =^{pair} iiii} } {{OwnPtr, 0ul> =^{Vector,0ul>}} {RefPtr =^{DatabaseThread}} Bi {OwnPtr =^{CSSStyleSelector}} BB {RefPtr =^{CSSPrimitiveValueCache}}^{Frame} {OwnPtr =^{CachedResourceLoader}} {RefPtr =^{DocumentPar SER}} B {KURL = {字符串= {RefPtr =^{StringImpl}}} b1b1iiiiiiiiii} {KURL = {字符串= {RefPtr =^{StringImpl}}} b1b1iiiiiiiiii} {KURL = {字符串= {RefPtr =^{StringImpl }}} b1b1iiiiiiiiii} {KURL = {字符串= {RefPtr =^{StringImpl}}} b1b1iiiiiiiiii} {KURL = {字符串= {RefPtr =^{StringImpl}}} b1b1iiiiiiiiii} {字符串= {RefPtr =^{StringImpl}} } {字符串= {RefPtr =^{StringImpl}}} {RefPtr =^{DocumentType}} {OwnPtr =^{的DOMImplementation}} IBIB {RefPtr =^{的CSSStyleSheet}} {RefPtr =^{的CSSStyleSheet}} {RefPtr =^{CSSStyleSheet}} {OwnPtr, 0ul> =^{Vector,0ul>}} BBBBiB {Color = IB} {RefPtr =^{Node}} {RefPtr =^{Node}} {RefPtr =^{Node}} {HashSet,WTF :: HashTraits = {HashTable,WTF :: PtrHash,WTF :: HashTraits,WTF :: HashTraits = ^^ {NodeIterator} iiii}} {HashSet,WTF: :HashTraits = {HashTable,WTF :: PtrHash,WTF :: HashTraits,WTF :: HashTraits = ^^ {Range} iiii}} S {RefPtr =^{StyleSheetList }} {ListHashSet = {的HashTable ,WTF :: ListHashSetNode,WTF :: IdentityExtractor *>,WTF :: ListHashSetNodeHashFunctions ,WTF :: HashTraits *>,WTF :: HashTraits *> = ^^ {ListHashSetNode} IIII }^{ListHashSetNode}^{ListHashSetNode} {OwnPtr =^{ListHashSetNodeAllocator}}} {ListHashSet = {的HashTable ,WTF :: ListHashSetNode,WTF :: IdentityExtractor *>,WTF :: ListHashSetNodeHashFunctions ,WTF :: HashTraits *>,WTF :: HashTraits *> = ^^ {ListHashSetNode} IIII}^{ListHashSetNode}^{ListHashSetNode} {OwnPtr =^{ListHashSetNodeAllocator}}} {ListHashSet = {的HashTable ,WTF :: ListHashSetNode,WTF :: IdentityExtractor *>,WTF :: ListHashSetNodeHashFunctions ,WTF :: HashTraits *>,WTF :: HashTraits *> = ^^ {ListHashSetNode} iiii}^{ListHashSetNode}^{ListHashSetNode} {OwnPtr =^{ListHashSetNodeAllocator}}} {HashMap中,WebCore的:: FormElementKeyHash,WebCore的:: FormElementKeyHashTraits,WTF :: HashTraits> = {的HashTable ,WTF :: PairFirstExtractor> ,WebCore的:: FormElementKeyHash,WTF :: PairHashTraits> ,WebCore的: :FormElementKeyHashTraits> =^{pair } iiii}} {Color = IB} {Color = IB} {Color = IB} {String = {RefPtr =^{StringImpl}}} {String = {RefPtr =^{StringImpl}} } {BBiB定時器= ^^?ddiI^{文獻} {?=^q}} BBBBBBBBBBBBBBBBBI {StringWithDirection = {字符串= {RefPtr =^{StringImpl}}} I} {StringWithDirection = {字符串= {RefPtr =^{StringImpl }}} I} B {RefPtr =^{元素}} {OwnPtr =^{RenderArena}}^{AXO bjectCache} {OwnPtr =^{DocumentMarkerController}} {定時器= ^^?ddiI^{文獻} {?=^Q}}^{元素} B {RefPtr =^{SerializedScriptValue}} dBi的{OwnPtr =^{ScriptRunner}} {OwnPtr =^{TransformSource}} {RefPtr =^{文獻}} I {字符串= {RefPtr =^{StringImpl}}} {字符串= {RefPtr =^{StringImpl}}} B {字符串= {RefPtr =^{StringImpl}}}^{渲染對象} {RefPtr =^{TextResourceDecoder}} I {CheckedRadioButtons = {OwnPtr,WTF :: HashTraits, WTF :: HashTraits> =^{HashMap,WTF :: HashTraits,WTF :: HashTraits }}} {FixedArray = [10 {CollectionCache = Q^{Element} IIi {HashMap,WTF: :WTF :: HashTraits *> = {HashTable,std :: pair *>,WTF :: PairFirstExtractor *> ,WTF :: PtrHash,WTF :: PairHashTraits, WTF :: HashTraits * > ,WTF :: HashTraits =^{pair *>} iiii}} {HashMap,WTF :: PtrHash,WTF :: HashTraits,WTF :: HashTraits *> WTF :: HashTraits * WTF :: HashTraits =^{pair *>} IIII}} BB}]} {FixedArray, WTF :: HashTraits, WTF :: HashTraits ,2UL> = [2 {HashMap中,WTF :: HashTraits,WTF :: HashTraits = {哈希表,WTF :: PairFirstExtractor ,WTF :: PtrHash,WTF :: PairHashTraits, WTF :: HashTraits ,WTF :: HashTraits =^{pair} iiii}}]} {RefPtr =^{XPathEvaluator}} {OwnPtr =^{SVGDocumentExtensions}} {向量= Q {VectorBuffer =^{DashboardRegionValue} Q}} BB {HashMap,WTF :: StringHash,WTF :: HashTraits,WTF :: HashTraits

= {的HashTable ,WTF :: PairFirstExtractor> ,WTF :: StringHash,WTF :: PairHashTraits, WTF :: HashTraits> ,WTF :: HashTraits =^{對 } IIII}} BB [ 1 {IconURL = i {KURL = {String = {RefPtr =^{StringImpl}}} b1b1iiiiiiiiii}}] {HashSet,WTF :: HashTraits = {HashTable,WTF :: PtrHash,WTF :: HashTraits,WTF :: HashTraits HashSet,WTF :: HashTraits = {HashTable,WTF :: PtrHash,WTF :: HashTraits,WTF :: HashTraits = ^^ {Element} iiii}} {HashSet,WTF :: HashTraits = {HashTable,WTF :: PtrHash,WTF :: HashTraits,WTF :: HashTraits = ^^ {Element} iiii}} {HashMap ,WTF :: HashTraits = {哈希表,WTF :: PairFirstExtractor ,WTF :: CaseFoldingHash,WTF :: PairHashTraits, WTF :: HashTraits>,WTF :: HashTraits =^{對} IIII}} {BBBBBBB = RefPtr^{EventQueue}} {RefPtr =^{DocumentWeakReference}} {HashSet,WTF :: HashTraits = {HashTable,WTF :: PtrHash,WTF :: HashTraits,WTF :: HashTraits = ^^ {MediaCanStartListener} iiii}} { QualifiedName的=^{QualifiedNameImpl}} B {RefPtr =^{元素}}^{RenderFullScreen} {定時器= ^^?ddiI^{文獻} {?=^q}} {的Deque,0ul> = {QQ VectorBuffer,0ul> =^{RefPtr} Q}} B {IntRect = {IntPoint = II} {IntSize = II}} {RefPtr =^{RenderStyle}} I {定時器= ^^?ddiI^{文獻} {?=^Q}} {ViewportArguments = FFFFFFF} BB {DocumentTiming = DDDDD} {RefPtr =^{MediaQueryMatcher}} BII {RefPtr =^{ContentSecurityPolicy}}} 16 @ 0:8

+0

你能現場的這些元數據的情況嗎?我很好奇。 –

+0

當然 - 將任何類型的STL聚合作爲參數傳遞給方法。編譯器將生成一個潛在的巨大字符串來描述由定義參數的類型的任何交叉乘積產生的結構 – bbum

+0

bbum - 我真的很喜歡閱讀您的回覆;謝謝。你之前說過,「Objective-C從來沒有設計過,也沒打算有這樣的反思。」你怎麼知道這件事的? –

8

您可以使用Objective-C運行功能:

Method class_getClassMethod(Class aClass, SEL aSelector) 
void method_getReturnType(Method method, char *dst, size_t dst_len) 

Objective-C Runtime Reference

首先,獲取方法對象,使用class_getClassMethod

Method m = class_getClassMethod([ SomeClass class ], @selector(someMethod)); 

然後,詢問使用method_getReturnType返回類型:

char ret[ 256 ]; 
method_getReturnType(m, ret, 256); 
NSLog(@"Return type: %s", ret); 
+1

是 - 很好的例子。但是,這個問題正在處理所有的邊界情況和類型編碼的潛在複雜性。 – bbum

+1

這應該是被接受的答案 – Lukas

相關問題