2010-03-21 66 views
1

所以我正在研究obj-c中的某些東西(我不想說什麼),我需要能夠使用任意變量在任意對象上調用任意方法。前兩個很容易做到,但我不確定如何執行可變參數。要清楚,這是而不是關於接收可變參數的函數/方法,但關於發送它們。我找到了兩種方法來實現這一點:objc_msgSendv(及其變體)在Objective-c運行時和NSInvocation中。 NSInvocation看起來更簡單,更像是'最佳實踐',但objc_msgSendv聽起來應該更快,而且我需要多次完成此操作,並且每次都完全不同的消息。我應該選擇哪一個? objc_msgSendv禁忌有一個很好的理由? (文檔說不要調用objc_msgsend函數。)有什麼更好的做法:objc_msgSendv或NSInvocation?

P.S.我知道所有參數的類型,並不是所有的參數都是id-s

另外,(不是主要問題的一部分),看起來並沒有從objc_msgSendv消息超級的方法,但是似乎並沒有在NSInvocation中做到這一點,所以對此的任何幫助都會很棒。

回答

3

objc_msgSendv已棄用;在64位Mac OS X應用程序中完全不可用。所以,無論如何,不​​要使用它。

真正的問題是你是否知道在編譯時設置的參數。如果是這樣,請使用objc_msgSend(或適當的變體)。

如果不是,那麼您將不得不使用某種機制將參數編碼到符合特定於您的特定目標體系結構的C ABI的調用中。 NSInvocation是這樣做的最簡單的方法,但是您的正確性是存在開銷。

您可以下載到libffi以獲得一定的效率,但仍然有大量的開銷構建自己的調用,而不是讓編譯器編譯一些代碼。

如果你有參數和返回類型的有限組合,你可以編譯一堆蹦牀函數並使用它們。

其實,真正的問題是「你想做什麼?」你描述的非常不典型。不是說你可能沒有很好的理由,只是無論它是什麼非常有趣(對我來說,無論如何)!

+1

謝謝,我不知道obj_msgSendv被折舊。我所做的只是稍微設計一些,但基本上我有點無聊,因爲我無法在iPad上編寫代碼。所以我在看的是爲obj-c的一個子集編寫解釋器的一些方法,所以即使我沒有在應用商店發佈,我在技術上也沒有違反蘋果的任何限制。我只是甚至考慮到這一點,因爲objective-c運行時是如此動態的(例如,我只能通過字符串等來調用可可/ uikit)。哦,我從來沒有註冊SDK,所以我不能在NDA下;) – 2010-03-21 03:45:43

+0

啊......好的。然後,ffi在iPhone平臺上不可用。 iPad在NDA之下;在這裏不能討論。 聽起來像一個有趣的項目。祝你好運。順便說一句,你可能想看看F-Script Anywhere。 – bbum 2010-03-21 04:02:42

1

請注意不成熟的優化。我將從更高級別的功能(NSInvocation)開始,因爲它更容易進行單元測試,代碼和調試。然後進行測量。只有當您的測量顯示在NSInvocations中及其周圍花費了大量時間(例如準備它們)時,才能轉到較低級別的功能(objc_msgSendv)。否則,即使objc_msgSendv速度更快,您也不會收到明顯的好處,但代碼難以維護。

相關問題