【问题标题】:Objective-c performSelector: vs performSelector:withObjectObjective-c performSelector: vs performSelector:withObject
【发布时间】:2011-12-15 01:32:39
【问题描述】:

调用[myObject performSelector:@selector(something) withObject:nil]; 和调用[myObject performSelector:@selector(something)]; 一样吗?

【问题讨论】:

    标签: objective-c selector performselector


    【解决方案1】:

    唯一的区别是您打算从@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:),而前一种方法不存在。但即使你传递了正确的选择器,它也会调用未定义的行为,因为方法参数的值从未定义过。
    • 啊,你去。感谢您的澄清。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多