使用传入其中的对象创建SEL

时间:2011-04-24 02:05:09

标签: objective-c selector

我知道如何使用:

[self method:object];

但是有可能获得这个的SEL对象吗?

SEL method = @selector(method:object);

不起作用。

谢谢:)

2 个答案:

答案 0 :(得分:6)

SEL只是选择器 - 发送的消息的名称。要捕获该消息的特定实例,其参数及其作为对象的返回值,您需要使用NSMethodSignatureNSInvocation。一个例子,基于您上面的假设-method:object

NSMethodSignature *sig = [SomeClass instanceMethodSignatureForSelector:@selector(method:)];
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:sig];

// Assume that someObject is an instance of SomeClass
[inv setTarget:someObject];

// Assume an "id object" declared elsewhere.
// Also note that self & _cmd are at indices 0 & 1, respectively
[inv setArgument:&object atIndex:2]

// Some time later...
[inv invoke];

请注意,因为NSInvocation是一个对象,所以不必立即调用它。它可以存储起来供以后使用,通常是 - 如果想立即发送消息,有更简单的方法来发送消息。例如,Cocoa的标准撤销/重做机制基于存储和调用NSInvocations。

答案 1 :(得分:0)

@selector是另一种方法或功能。

以此为例:

-(IBAction)timerStart {
timer = [NSTimer scheduledTimerWithTimeInterval:2.0
target:self
selector:@selector(targetMethod:)
userInfo:nil
repeats:NO];
}

-(void)targetMethod:(id)sender {
[timer invalidate];
timer = nil;
}

如您所见,运行NSTimer两秒后,选择器(targetMethod :)将被调用。 targetMethod:是一个(void)函数:(id)sender,因此运行。

在你的情况下,我认为你想要完成的是

[self performSelector:@selector(methodName:)];