8

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

由于我对 Objective-C 非常陌生,因此非常感谢一个说明性示例。

4

2 回答 2

17

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

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

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

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

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

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

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

于 2009-07-05T05:03:17.933 回答
6

是的!在 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 已经基于完全动态的方法调度表。不过,如果您只需要对函数的引用,听起来使用选择器维护函数指针对您来说会很好。

于 2009-07-05T05:04:28.540 回答