【问题标题】:For Objective-C ... Pointer to method对于 Objective-C ... 指向方法的指针
【发布时间】:2010-11-08 04:22:21
【问题描述】:

我想设置一个方法调度表,我想知道是否可以在 Objective-C 中创建指向方法的指针(如 C 中的函数指针)。我尝试使用一些 Objective-C 运行时函数来动态切换方法,但问题是它会影响所有实例。

由于我对 Objective-C 非常陌生,因此非常感谢您提供一个图解示例。

【问题讨论】:

    标签: objective-c pointers methods dispatch


    【解决方案1】:

    Objective-C 方法称为selectors,由SEL 数据类型表示。如果您的对象继承自 NSObject,您可以告诉它执行选择器(即调用方法),如下所示:

    SEL selector = @selector(doSomething:);
    [obj performSelector:selector withObject:argument];
    

    这假设您定义了一个方法,例如:

    -(void)doSomething:(MyObject*)arg;
    

    选择器通过@selector 关键字分配给SEL 数据类型,该关键字采用您要保留的方法的名称。方法的名称是去掉所有参数的方法名称。例如:

    -(void)doSomething:(MyObject*)arg withParams:(MyParams*)params
    

    将被引用为@selector(doSomething:withParams:)

    【讨论】:

      【解决方案2】:

      是的!在 Objective-C 中,函数指针被称为选择器。如果你有这样定义的方法:

      - (void)myFunctionWithObject:(NSObject*)obj otherObject:(NSNumber*)obj2
      {
      }
      

      选择器声明如下:

      @selector(myFunctionWithObject:otherObject:)
      

      要对对象执行选择器,您可以使用:

      [object performSelector:@selector(myFunction)];
      

      [object performSelector:@selector(myFunctionTakingParameter:) withObject: o];
      

      选择器数据类型对线程和计时器特别有用,您可以在其中分派一个线程并为它提供一个选择器,用于您希望它调用的消息。如果您需要创建一个选择器数组(或一个调度表),或者如果您需要调用具有多个参数的选择器,您可以使用 NSInvocation 类。它为选择器提供了一个包装器,并允许您指定实际参数。

      您应该记住,Objective-C 已经基于完全动态的方法调度表。不过,如果您只需要一个函数的引用,听起来使用选择器维护函数指针对您来说会很好。

      【讨论】:

      • 您可能希望将第二句更改为:如果您有这样定义的 METHOD。
      • 非常感谢,本。是的,运行时本身就是一个完全动态的补丁表,这绝对是正确的。
      猜你喜欢
      • 1970-01-01
      • 2011-05-19
      • 2016-10-24
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      相关资源
      最近更新 更多