60

我有一个SEL从当前对象获取 a 的代码示例,

SEL callback = @selector(mymethod:parameter2);

我有一个方法

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

现在我需要移动mymethod到另一个对象,比如说myDelegate

我试过了:

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

但它不会编译。

4

3 回答 3

102

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 消息。

于 2008-11-18T02:48:39.590 回答
18

您不能在@selector() 中传递参数。

看起来您正在尝试实现回调。最好的方法是这样的:

[object setCallbackObject:self withSelector:@selector(myMethod:)];

然后在你的对象的 setCallbackObject:withSelector: 方法中:你可以调用你的回调方法。

-(void)setCallbackObject:(id)anObject withSelector:(SEL)selector {
    [anObject performSelector:selector];
}
于 2008-11-18T02:34:44.220 回答
5

除了已经说过的关于选择器的内容之外,您可能还想查看 NSInvocation 类。

NSInvocation 是一个呈现为静态的 Objective-C 消息,也就是说,它是将一个动作转换为一个对象。NSInvocation 对象用于在对象之间和应用程序之间存储和转发消息,主要由 NSTimer 对象和分布式对象系统来实现。

NSInvocation 对象包含 Objective-C 消息的所有元素:目标、选择器、参数和返回值。这些元素中的每一个都可以直接设置,并且在调度 NSInvocation 对象时自动设置返回值。

Keep in mind that while it's useful in certain situations, you don't use NSInvocation in a normal day of coding. If you're just trying to get two objects to talk to each other, consider defining an informal or formal delegate protocol, or passing a selector and target object as has already been mentioned.

于 2008-11-18T04:11:22.653 回答