从带有参数的方法名称创建选择器

2024-06-10

我有一个代码示例,它得到SEL从当前对象,

SEL callback = @selector(mymethod:parameter2);

我有一个像这样的方法

 -(void)mymethod:(id)v1 parameter2;(NSString*)v2 {
}

现在我需要搬家mymethod到另一个对象,说myDelegate.

我努力了:

SEL callback = @selector(myDelegate, mymethod:parameter2);

但它不会编译。


SEL 是 Objective-C 中代表选择器的类型。 @selector() 关键字返回您描述的 SEL。它不是函数指针,您不能向它传递任何类型的对象或引用。对于选择器(方法)中的每个变量,您必须在对 @selector 的调用中表示它。例如:

-(void)methodWithNoParameters;
SEL noParameterSelector = @selector(methodWithNoParameters);

-(void)methodWithOneParameter:(id)parameter;
SEL oneParameterSelector = @selector(methodWithOneParameter:); // notice the colon here

-(void)methodWIthTwoParameters:(id)parameterOne and:(id)parameterTwo;
SEL twoParameterSelector = @selector(methodWithTwoParameters:and:); // notice the parameter names are omitted

选择器通常传递给委托方法和回调,以指定在回调期间应在特定对象上调用哪个方法。例如,当创建一个定时器时,回调方法具体定义为:

-(void)someMethod:(NSTimer*)timer;

因此,当您安排计时器时,您将使用 @selector 来指定对象上的哪个方法实际上负责回调:

@implementation MyObject

-(void)myTimerCallback:(NSTimer*)timer
{
    // do some computations
    if( timerShouldEnd ) {
      [timer invalidate];
    }
}

@end

// ...

int main(int argc, const char **argv)
{
    // do setup stuff
    MyObject* obj = [[MyObject alloc] init];
    SEL mySelector = @selector(myTimerCallback:);
    [NSTimer scheduledTimerWithTimeInterval:30.0 target:obj selector:mySelector userInfo:nil repeats:YES];
    // do some tear-down
    return 0;
}

在本例中,您指定每 30 秒向对象 obj 发送一次 myTimerCallback 消息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从带有参数的方法名称创建选择器 的相关文章

随机推荐