2011-04-24 79 views
0

我知道如何使用:创建对象的SEL传递给它

[self method:object]; 

但是,它可能得到的这个SEL对象?

SEL method = @selector(method:object); 

不起作用。

谢谢:)

+1

选择器只不过是方法签名 - 它们不会与作为参数传递的对象一起提供。你想达到什么目的? – BoltClock 2011-04-24 02:11:26

+0

我需要得到一个选择器的参考传入它的对象 - 因为使用[self method:object];不会削减它:( – 2011-04-24 02:12:24

+3

@BoltBlock选择器不是真正的方法签名,因为它不会对类型进行编码。更准确的定义是选择器表示方法名称。 – 2011-04-24 03:57:24

回答

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。

+0

这意味着[inv invoke];会调用该方法吗? – 2011-04-24 05:22:55

+0

是的,完全相同 - 它会做相当于'[someObject method:object]'。 – 2011-04-24 05:27:32

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; 
} 

正如你所看到的,选择(targetMethod :)被调用到行动的NSTimer两秒钟运行后。 targetMethod:是一个(void)函数:(id)发送者,因此运行。

在你的情况,我认为你要做到的是

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

'withObject:'... – BoltClock 2011-04-24 02:43:00

相关问题