4

我試圖獲取協議中聲明的方法的簽名 - 或者NSMethodSignature對象或至少是類型編碼字符串。協議方法的類型編碼字符串

詢問Protocol對象本身是不可能的,因爲a)它不實現methodSignatureForSelector:,和b)(如Kevin所述),它已被棄用。

運行時功能protocol_getMethodDescription返回struct objc_method_description,這在文檔中的任何地方都沒有描述。這是在一個公共頭,雖然 - <objc/runtime.h>

struct objc_method_description { 
    SEL name; 
    char *types; 
}; 

似乎可以合理地假定types串在那裏將是同一種簽名編碼字符串的其他地方使用,如由+[NSMethodSignature signatureWithObjCTypes:]預期,實際上,它看起來正確。

我無法追查的是該字符串與類型編碼過程之間的實際可驗證連接。

我不認爲這會是些什麼,不過,我必須爲依託這個types字符串有效,以便與其它物品/功能在同一個運行時互動任何理由?請注意,我不是自己編寫編碼字符串,或者期望它們具有給定的格式或值 - 我只想將它們從運行時/框架的一部分傳遞到另一部分,即從協議中檢索編碼字符串, )使用它來生成NSMethodSignature對象,並且可能b)將其與運行時生成的NSInvocation(即-forwardInvocation:)中的對象進行比較。

+0

對未來的注意:引發這個問題的一個主要誤解是,它是運行時正在執行方法簽名的原始構造,而實際上這是編譯器的工作。 – 2013-11-02 02:54:53

回答

5

使用Protocol作爲對象已被棄用。如果您檢查標頭<objc/Protocol.h>,您會看到幾乎所有內容都不在OBJC-2中提供,或者從OS X 10.5開始不推薦使用。您可以按照您的建議使用protocol_getMethodDescription(),並將types字段取出。我不確定實際上是否正式記錄了這是該方法的類型編碼,但確實如此。

+0

我想也許我不應該包含使用'Protocol'對象的那一點,因爲我很快排除了它。感謝您的確認。我無法找到該領域的任何文檔 - 您認爲這只是一個「不完整的文檔」問題?任何想法在運行時,字符串的構造都被埋沒了? – 2012-01-09 21:02:55

+0

@JoshCaswell:許多潛在的運行時間的東西沒有特別詳細記錄,但在這種情況下,假設這個'type'字段除了'@ encode'字符串之外沒有別的東西可以存在的類型。 – 2012-01-09 21:17:25

相關問題