Objective-c performSelector:vs performSelector:withObject

时间:2011-12-15 01:32:39

标签: objective-c selector performselector

调用[myObject performSelector:@selector(something) withObject:nil];与调用[myObject performSelector:@selector(something)];相同吗?

1 个答案:

答案 0 :(得分:5)

唯一的区别是您打算从@selector调用的方法的签名。当方法不带参数时使用performSelector,如果方法采用类型为performSelector:withObject的单个参数,则使用id。否则,他们都做同样的事情。

来自NSObject Protocol Reference

  

讨论

     

此方法与performSelector相同:除了你   可以为aSelector提供参数。 aSelector应该识别出一个   采用id类型的单个参数的方法。对于其他方法   参数类型和返回值,使用NSInvocation。

正如查克指出的那样,这并没有真正得到执行(至少目前还没有)。下面的代码执行正常,没有任何例外被抛给我。

-(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!");
}