我需要檢查NSInvocation
的返回類型以查看它是否爲對象(從那裏我可以使用isKindOfClass:
檢查確切類型的對象)。我看到NSInvocation
有NSMethodSignature
,而這又有methodReturnType
。但是,文檔提供了以下警告:獲取NSMethodSignature的返回類型
此編碼是特定於實現的,因此應用程序應謹慎使用它。
那麼,我該如何安全地檢查返回類型是否是一個對象呢?是否有@encode(type-name)
的解碼版本?
我需要檢查NSInvocation
的返回類型以查看它是否爲對象(從那裏我可以使用isKindOfClass:
檢查確切類型的對象)。我看到NSInvocation
有NSMethodSignature
,而這又有methodReturnType
。但是,文檔提供了以下警告:獲取NSMethodSignature的返回類型
此編碼是特定於實現的,因此應用程序應謹慎使用它。
那麼,我該如何安全地檢查返回類型是否是一個對象呢?是否有@encode(type-name)
的解碼版本?
總之,你不能。至少,不是100%的保真度。
對於簡單的類型,如雙打,浮動,整數,ID等...您可以檢查返回類型,然後以平臺特定的方式處理它。對於更復雜的類型 - 結構體,C++對象等等 - 你可以沿着試圖弄清楚CABI是如何在每個ABI基礎上佈置數據的路徑,但是你最終會在這個過程中重新發明編譯器。
幸運的是,有一些非常全面的例子說明了所有這些工作。 PyObjC和RubyCocoa(MacRuby)項目都是開源的,並且對任意返回值提供了相對完整的支持。相對;你仍然會被複雜的類型弄糟。總而言之,Objective-C在調度時是純粹動態的,但在參數傳遞和返回值方面非常多的是C派生的靜態語言。
錯過了最後一句話。在咖啡之前,銳化是強大的。
這是set of characters that might be returned by methodReturnType
。
您將尋找@
。如果methodReturnType
返回const char *
,則可能會遇到對象返回類型返回的不僅僅是@
;可能會附加修飾符。您將不得不測試一堆方法的返回類型,以查看實際情況(上述元數據的生成在多年以來發生了變化,並且還受到在方法聲明中使用各種關鍵字的影響)。
但是,大部分時間@
足以證明它是一個對象返回類型。 Most
會增加你自己聲明方法的真實性(從編譯器的角度來看,你希望不會做任何非常奇怪的事情)。
請注意,OP的最後一個問題是關於如果它是一個對象(我認爲他的意思是一個ObjC對象)的具體測試。用@encode(id)進行字符串比較應該很容易且安全地測試,對嗎? (只是一般情況太複雜了。) –