【发布时间】:2011-12-15 01:32:39
【问题描述】:
调用[myObject performSelector:@selector(something) withObject:nil]; 和调用[myObject performSelector:@selector(something)]; 一样吗?
【问题讨论】:
标签: objective-c selector performselector
调用[myObject performSelector:@selector(something) withObject:nil]; 和调用[myObject performSelector:@selector(something)]; 一样吗?
【问题讨论】:
标签: objective-c selector performselector
唯一的区别是您打算从@selector 调用的方法的签名。当方法不接受参数时使用performSelector,如果方法接受id 类型的单个参数,则使用performSelector:withObject。否则,他们都做完全相同的事情。
来自NSObject Protocol Reference:
讨论
这个方法和 performSelector 一样:除了你 可以为 aSelector 提供参数。 aSelector 应该标识一个 采用 id 类型的单个参数的方法。对于其他方法 参数类型和返回值,使用 NSInvocation。
正如 Chuck 指出的那样,这并没有真正强制执行(至少目前不是)。下面的代码执行得很好,没有向我抛出任何异常。
-(void)viewDidLoad
{
[super viewDidLoad];
[self performSelector:@selector(foo) withObject:nil];
}
-(void)foo
{
NSLog(@"foo!");
}
另一方面,这个版本的代码确实引起了问题。所以这不是双向的。
-(void)viewDidLoad
{
[super viewDidLoad];
[self performSelector:@selector(foo)];
}
-(void)foo:(id)myParameter
{
NSLog(@"foo!");
}
【讨论】:
@selector(foo) 而不是@selector(foo:),而前一种方法不存在。但即使你传递了正确的选择器,它也会调用未定义的行为,因为方法参数的值从未定义过。