【发布时间】:2010-11-08 04:22:21
【问题描述】:
我想设置一个方法调度表,我想知道是否可以在 Objective-C 中创建指向方法的指针(如 C 中的函数指针)。我尝试使用一些 Objective-C 运行时函数来动态切换方法,但问题是它会影响所有实例。
由于我对 Objective-C 非常陌生,因此非常感谢您提供一个图解示例。
【问题讨论】:
标签: objective-c pointers methods dispatch
我想设置一个方法调度表,我想知道是否可以在 Objective-C 中创建指向方法的指针(如 C 中的函数指针)。我尝试使用一些 Objective-C 运行时函数来动态切换方法,但问题是它会影响所有实例。
由于我对 Objective-C 非常陌生,因此非常感谢您提供一个图解示例。
【问题讨论】:
标签: objective-c pointers methods dispatch
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:)。
【讨论】:
是的!在 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 已经基于完全动态的方法调度表。不过,如果您只需要一个函数的引用,听起来使用选择器维护函数指针对您来说会很好。
【讨论】: