2012-10-10 91 views
2

我需要檢查NSInvocation的返回類型以查看它是否爲對象(從那裏我可以使用isKindOfClass:檢查確切類型的對象)。我看到NSInvocationNSMethodSignature,而這又有methodReturnType。但是,文檔提供了以下警告:獲取NSMethodSignature的返回類型

此編碼是特定於實現的,因此應用程序應謹慎使用它。

那麼,我該如何安全地檢查返回類型是否是一個對象呢?是否有@encode(type-name)的解碼版本?

回答

4

總之,你不能。至少,不是100%的保真度。

對於簡單的類型,如雙打,浮動,整數,ID等...您可以檢查返回類型,然後以平臺特定的方式處理它。對於更復雜的類型 - 結構體,C++對象等等 - 你可以沿着試圖弄清楚CABI是如何在每個ABI基礎上佈置數據的路徑,但是你最終會在這個過程中重新發明編譯器。

幸運的是,有一些非常全面的例子說明了所有這些工作。 PyObjC和RubyCocoa(MacRuby)項目都是開源的,並且對任意返回值提供了相對完整的支持。相對;你仍然會被複雜的類型弄糟。總而言之,Objective-C在調度時是純粹動態的,但在參數傳遞和返回值方面非常多的是C派生的靜態語言。


錯過了最後一句話。在咖啡之前,銳化是強大的。

這是set of characters that might be returned by methodReturnType

您將尋找@。如果methodReturnType返回const char *,則可能會遇到對象返回類型返回的不僅僅是@;可能會附加修飾符。您將不得不測試一堆方法的返回類型,以查看實際情況(上述元數據的生成在多年以來發生了變化,並且還受到在方法聲明中使用各種關鍵字的影響)。

但是,大部分時間@足以證明它是一個對象返回類型。 Most會增加你自己聲明方法的真實性(從編譯器的角度來看,你希望不會做任何非常奇怪的事情)。

+1

請注意,OP的最後一個問題是關於如果它是一個對象(我認爲他的意思是一個ObjC對象)的具體測試。用@encode(id)進行字符串比較應該很容易且安全地測試,對嗎? (只是一般情況太複雜了。) –