我知道如何使用:创建对象的SEL传递给它
[self method:object];
但是,它可能得到的这个SEL对象?
SEL method = @selector(method:object);
不起作用。
谢谢:)
我知道如何使用:创建对象的SEL传递给它
[self method:object];
但是,它可能得到的这个SEL对象?
SEL method = @selector(method:object);
不起作用。
谢谢:)
一个SEL
只是选择 - 这是发送邮件的名称。要捕获该消息的特定实例,其参数和作为对象的返回值,需要使用NSMethodSignature和NSInvocation。举例来说,基于上述假想的-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。
这意味着[inv invoke];会调用该方法吗? – 2011-04-24 05:22:55
是的,完全相同 - 它会做相当于'[someObject method:object]'。 – 2011-04-24 05:27:32
@ 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:)];
'withObject:'... – BoltClock 2011-04-24 02:43:00
选择器只不过是方法签名 - 它们不会与作为参数传递的对象一起提供。你想达到什么目的? – BoltClock 2011-04-24 02:11:26
我需要得到一个选择器的参考传入它的对象 - 因为使用[self method:object];不会削减它:( – 2011-04-24 02:12:24
@BoltBlock选择器不是真正的方法签名,因为它不会对类型进行编码。更准确的定义是选择器表示方法名称。 – 2011-04-24 03:57:24