2017-06-03 69 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