【问题标题】:how to assign a method pointer to block variable in objectivec如何将方法指针分配给目标c中的块变量
【发布时间】:2023-03-13 19:43:02
【问题描述】:
  1. 我 typedef 一个类似下面的块

    typedef void(^cbGeneric)();
    
  2. 我在类中使用块定义属性

    @property(nonatomic, strong)cbGeneric batchLoadStartedEvent;
    
  3. 我需要给这个属性绑定一个类的成员方法地址。

如何获取类成员方法的指针并将其分配给块属性?谢谢

【问题讨论】:

  • 你能解释一下为什么吗?如果您希望该块被方法调用,只需编写一个调用它的方法即可。
  • 用于事件委托而不是objective-c的协议,因为协议的事件需要一个类来实现它。它不如处理事件的方法灵活。

标签: objective-c pointers methods block


【解决方案1】:

我需要给这个属性绑定一个类的成员方法地址。

不清楚你在这里追求什么。无论您是调用实例方法还是类方法,都需要传递两个隐式参数:self 的值和SEL 类型的值。你都没有提到这些。

我怀疑您正在尝试为属性分配一个块值,该值将调用某些方法,传递所需的任何参数。在这种情况下,只需分配一个块值,例如:

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

其中obj 引用您希望设置其属性的对象,[someObject someMethod] 是您希望在任何对象或类上调用的任何方法,并包含您希望传递的任何参数。

HTH

【讨论】:

  • 目前我只是用这种方式实现的。但我觉得这种方式不够优雅。
  • 这是 (Objective-)C 块的外观和行为方式。块类似于 C# 中的匿名函数。如果您想要等效的 C 函数指针,您至少需要存储函数地址本身(将 IMP 转换为确切的函数类型)、选择器 (SEL) 和对象引用(被调用函数的 @987654328 @) - 存储这 3 个值并不比上面的块表达式更优雅。但是优雅可能在旁观者的眼中!
【解决方案2】:

例如,您可以使用class_getMethodImplementation() 获取成员方法地址。但这无济于事,因为您不能将方法实现(基本上是函数)分配给块 var。这是因为块不仅仅是函数变量,而是闭包。闭包有一个创建上下文,方法有一个对象上下文。那不一样。

但是,有一些选择可以得到,你可能想要得到什么:

不要使用块变量,而是使用IMP 类型的方法实现变量。如果您执行该方法,请记住按照方法的预期传递一个self 指针和一个selector

你可以有一个选择器变量,它存储要执行的方法的选择器。它的类型是SEL。然后您可以使用-performSelector: 系列的一种方法发送消息。

您可以将一个块分配给您当前的 ivar,除了使用方法的选择器发送消息之外什么都不做。 (“调用”所需的方法。)

如果您提供有关您的情况的更多信息,我可以为您的问题添加更详细的解决方案。

【讨论】:

  • 是的,我尝试将 IMP 定义为属性,并尝试将选择器的值分配给该属性。但编译器无法将 IMP 识别为属性。
  • 我想为属性提供一个方法地址作为事件处理程序,如 c# 委托。我可以将另一个实例方法绑定到此方法指针以指向手事件。
  • 我可以回答那个 cmets,我。 e. IMPSEL 是不同的类型。但是你有一个完全错误的方法。这不是 C#。请阅读 Objective-C 委托机制的介绍。
  • 是的,我知道objective-c的事件是使用协议关键字来实现事件。但是所有事件都集成到一个类的实例中。它不灵活。 IMAGINE:有3个事件,如果需要拆分3个事件,需要定义3个协议,定义3个类分别实现。如果回调可以直接绑定到一个方法指针,就很灵活了,我可以快速绑定事件和方法点,而不是定义协议和实现的类。
  • 你误解了这个概念。委托是一种专业化,出于某些原因取代了子类化。在那里拥有三个不同的专用实例是没有意义的。如果您想拥有“处理程序”,请使用我的回答中选项 #2 中描述的操作目标范例。但是,您不应该使用实现,因为它会破坏动态绑定。再说一遍:阅读 Objective-C 的介绍。
猜你喜欢
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多