我的typedef象下面如何分配方法指針以塊變量中的ObjectiveC
typedef void(^cbGeneric)();
我在一個類
@property(nonatomic, strong)cbGeneric batchLoadStartedEvent;
我需要限定使用塊的屬性的塊將類的成員方法地址綁定到此屬性。
如何獲取類的成員方法的指針並將其分配給塊屬性?謝謝
我的typedef象下面如何分配方法指針以塊變量中的ObjectiveC
typedef void(^cbGeneric)();
我在一個類
@property(nonatomic, strong)cbGeneric batchLoadStartedEvent;
我需要限定使用塊的屬性的塊將類的成員方法地址綁定到此屬性。
如何獲取類的成員方法的指針並將其分配給塊屬性?謝謝
例如,您可以獲得成員方法地址class_getMethodImplementation()
。但是這沒有幫助,因爲你不能將一個方法實現(基本上是一個函數)分配給一個塊var。這是因爲塊不是簡單的函數變量,而是閉包。關閉有一個創造性的上下文,方法有一個對象上下文。這不一樣。
不過,也有選項來獲得,你可能想:
而是具有嵌段變種,使用IMP
類型的方法實現變種。如果您執行該方法,請記住根據方法的預期傳遞self
指針和selector
。
您可以有一個選擇器var,它存儲要執行的方法的選擇器。它的類型是SEL
。然後您可以使用-performSelector:
系列的一種方法發送消息。
您可以爲您的當前ivar分配一個塊,除了使用方法的選擇器發送消息之外別無它物。 (其中「呼叫」期望的方法。)
如果您提供有關您的情況的更多信息,我可以添加更適合您的問題的更詳細的解決方案。
是的,我嘗試將IMP定義爲屬性,並嘗試將選擇器的值分配給此屬性。但編譯器無法將IMP識別爲屬性。 –
我想給一個方法地址作爲事件處理程序的屬性,如C#委託。我可以將另一個實例方法綁定到此事件的方法指針。 –
我可以回答那個評論,我。即「IMP」和「SEL」是不同的類型。但是你有一個完全錯誤的方法。這不是C#。請閱讀Objective-C的委託機制介紹。 –
我需要將類的成員方法地址綁定到此屬性。
現在還不清楚你在這裏之後。無論您是調用實例方法還是類方法,都需要傳遞兩個隱式參數:值爲self
,值爲SEL
。你沒有提到這些。
我懷疑你試圖做的是分配給屬性的塊值,這將調用某些方法,傳遞任何所需的參數。在這種情況下,只分配一個塊值,是這樣的:
obj.batchLoadStartedEvent = ^{ [someObject someMethod]; };
凡obj
引用它的屬性,你要設置和[someObject someMethod]
是要調用任何方法,對任何對象或類,幷包括任何參數對象你想通過。
HTH
目前,我只是用這種方式來實現。但我認爲這種方式不夠優雅。 –
這是(Objective-)C塊的外觀和行爲方式。塊類似於C#中的匿名函數。如果你想要C函數指針的等價物,你至少需要存儲函數地址本身(將'IMP'轉換爲確切的函數類型),選擇器('SEL')和對象引用(被調用函數的'self ') - 存儲這3個值不會比上面的塊表達更優雅。但優雅可能在旁觀者的眼中! – CRD
你能解釋一下爲什麼嗎?如果你想要塊被方法調用,只需編寫一個調用它的方法。 – danh
而不是協議的目標c,因爲協議的事件需要一個類來實現它。它不是一種靈活的事件處理方法。 –