2017-06-03 96 views
0
  1. 我的typedef象下面如何分配方法指針以塊變量中的ObjectiveC

    typedef void(^cbGeneric)(); 
    
  2. 我在一個類

    @property(nonatomic, strong)cbGeneric batchLoadStartedEvent; 
    
  3. 我需要限定使用塊的屬性的塊將類的成員方法地址綁定到此屬性。

如何獲取類的成員方法的指針並將其分配給塊屬性?謝謝

+0

你能解釋一下爲什麼嗎?如果你想要塊被方法調用,只需編寫一個調用它的方法。 – danh

+0

而不是協議的目標c,因爲協議的事件需要一個類來實現它。它不是一種靈活的事件處理方法。 –

回答

1

例如,您可以獲得成員方法地址class_getMethodImplementation()。但是這沒有幫助,因爲你不能將一個方法實現(基本上是一個函數)分配給一個塊var。這是因爲塊不是簡單的函數變量,而是閉包。關閉有一個創造性的上下文,方法有一個對象上下文。這不一樣。

不過,也有選項來獲得,你可能想:

而是具有嵌段變種,使用IMP類型的方法實現變種。如果您執行該方法,請記住根據方法的預期傳遞self指針和selector

您可以有一個選擇器var,它存儲要執行的方法的選擇器。它的類型是SEL。然後您可以使用-performSelector:系列的一種方法發送消息。

您可以爲您的當前ivar分配一個塊,除了使用方法的選擇器發送消息之外別無它物。 (其中「呼叫」期望的方法。)

如果您提供有關您的情況的更多信息,我可以添加更適合您的問題的更詳細的解決方案。

+0

是的,我嘗試將IMP定義爲屬性,並嘗試將選擇器的值分配給此屬性。但編譯器無法將IMP識別爲屬性。 –

+0

我想給一個方法地址作爲事件處理程序的屬性,如C#委託。我可以將另一個實例方法綁定到此事件的方法指針。 –

+0

我可以回答那個評論,我。即「IMP」和「SEL」是不同的類型。但是你有一個完全錯誤的方法。這不是C#。請閱讀Objective-C的委託機制介紹。 –

1

我需要將類的成員方法地址綁定到此屬性。

現在還不清楚你在這裏之後。無論您是調用實例方法還是類方法,都需要傳遞兩個隱式參數:值爲self,值爲SEL。你沒有提到這些。

我懷疑你試圖做的是分配給屬性的塊值,這將調用某些方法,傳遞任何所需的參數。在這種情況下,只分配一個塊值,是這樣的:

obj.batchLoadStartedEvent = ^{ [someObject someMethod]; }; 

obj引用它的屬性,你要設置和[someObject someMethod]是要調用任何方法,對任何對象或類,幷包括任何參數對象你想通過。

HTH

+0

目前,我只是用這種方式來實現。但我認爲這種方式不夠優雅。 –

+1

這是(Objective-)C塊的外觀和行爲方式。塊類似於C#中的匿名函數。如果你想要C函數指針的等價物,你至少需要存儲函數地址本身(將'IMP'轉換爲確切的函數類型),選擇器('SEL')和對象引用(被調用函數的'self ') - 存儲這3個值不會比上面的塊表達更優雅。但優雅可能在旁觀者的眼中! – CRD