7 methods pointers objective-c dispatch
我想设置一个方法调度表,我想知道是否可以创建指向Objective-C中的方法的指针(如指向C中的函数的指针).我尝试使用一些Objective-C运行时函数来动态切换方法,但问题是它会影响所有实例.
由于我是Objective-C的新手,因此非常感谢一个示例.
Jas*_*son 16
Objective-C方法称为selectors,由SEL数据类型表示.如果您的对象继承自NSObject,则可以告诉它执行选择器(即调用方法),如下所示:
SEL selector = @selector(doSomething:);
[obj performSelector:selector withObject:argument];
Run Code Online (Sandbox Code Playgroud)
这假定您有一个定义的方法,例如:
-(void)doSomething:(MyObject*)arg;
Run Code Online (Sandbox Code Playgroud)
选择器SEL通过@selector关键字分配给数据类型,该关键字采用您希望保留的方法的名称.方法的名称是剥离了所有参数的方法名称.例如:
-(void)doSomething:(MyObject*)arg withParams:(MyParams*)params
Run Code Online (Sandbox Code Playgroud)
将被引用为@selector(doSomething:withParams:).
是! 在Objective-C中,函数指针称为选择器.如果你有一个像这样定义的方法:
- (void)myFunctionWithObject:(NSObject*)obj otherObject:(NSNumber*)obj2
{
}
Run Code Online (Sandbox Code Playgroud)
选择器声明如下:
@selector(myFunctionWithObject:otherObject:)
Run Code Online (Sandbox Code Playgroud)
要在对象上执行选择器,您可以使用:
[object performSelector:@selector(myFunction)];
Run Code Online (Sandbox Code Playgroud)
要么
[object performSelector:@selector(myFunctionTakingParameter:) withObject: o];
Run Code Online (Sandbox Code Playgroud)
选择器数据类型对于线程和计时器特别有用,您可以在其中调度线程并为您希望调用的消息提供选择器.如果需要创建选择器数组(或调度表),或者需要调用具有多个参数的选择器,则可以使用NSInvocation类.它为选择器提供了一个包装器,允许您指定实际的参数.
您应该记住,Objective-C已经基于一个完全动态的方法调度表.听起来像使用选择器维护函数指针,如果你只需要一个函数的引用,它将适合你.
| 归档时间: |
|
| 查看次数: |
5958 次 |
| 最近记录: |