我的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,因为协议的事件需要一个类来实现它。它不是一种灵活的事件处理方法。 –