2013-08-18 60 views
4

是否有可能創建一個IMP,其中參數數量與正在解析的實例方法的選擇器匹配?具有未知數量參數的IMP

我可以使用'if'語句和有限數量的參數(比如介於0和10之間),但是有可能使用例如IMP_implementationWithBlock和va_args?

+1

這聽起來像你最近的帖子,你可能會進入你想要看libffi的領域,如果你還沒有。我在GitHub上有兩個使用libffi的項目:[WoolBlockInvocation](https://github.com/woolsweater/WoolBlockInvocation)和[WoolDelegate](https://github.com/woolsweater/WoolDelegate) 。關於他們的SO帖子:[在ObjC中,你可以編寫一個組合2個塊的函數嗎?](http://stackoverflow.com/a/17892240),[用塊創建代表](http:// stackoverflow。 COM /一個/ 16113046)。你可能會發現它們很有趣。 –

+0

謝謝喬希。 。我玩libextobjc方面(基於libffi),但遇到一些崩潰(這個庫'AOP實現仍然是實驗性的)。 。 。所以我大概知道libffi可以做什麼,但就我的經驗而言,這是遠遠不夠的。我會檢查那些圖書館和職位。 。 。任何其他參考資料/學習的地方也會有所幫助。 –

+0

爲什麼倒票!? –

回答

2

您不能在C運行時創建函數;編譯時必須知道參數的數量。

您可以使用可變參數函數假裝您有任意數量參數的函數(我已包含this usage in a recent project),但這可能不可移植並且可能是未定義行爲。

如果您需要在簽名和參數未知的函數之間移動參數直到運行時,您幾乎肯定希望查看libffi。

Mike Ash有一些真正有用的帖子:http://www.mikeash.com/pyblog/?tag=libffi 這就是我開始學習和了解我所瞭解的大部分內容。

+0

更新:不再推薦使用可變參數函數,與arm64一樣,參數直接指向寄存器。我們現在使用'forwardInvocation'方法。 –

相關問題