You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS开发:为何传递onClick方法作为参数时省略(id)sender?

为什么用@selector传递方法时要省略参数声明?

嘿,这个问题问到点子上了,我来给你把这个逻辑掰碎了说~

首先得搞明白,@selector()的本质是生成一个方法标识(SEL类型),它的作用只是告诉系统「我要调用哪个方法」,而不是去定义方法本身。所以它只需要关注方法的「名字」和「参数的数量」,完全不用管参数具体是什么类型、叫什么变量名。

你看你写的这段代码:

[button addTarget:self action:@selector(onClick:) forControlEvents:UIControlEventTouchUpInside];
-(void)onClick:(id)sender{
    self.label.text=@"HelloWorld";
    NSLog(@"%@",self.label.text);
}

这里@selector(onClick:)里的**冒号:**是核心——它代表这个方法有1个参数。Objective-C里是靠冒号的数量来区分不同方法签名的,比如onClick(无参数)和onClick:(一个参数)是完全不同的两个选择器。

而(id)sender是你在定义方法时,用来接收系统传递过来的参数的声明,这属于方法实现的细节。选择器只需要告诉系统「找那个带一个参数的onClick方法」,至于这个参数是什么类型、叫什么名字,系统在调用方法的时候会自动匹配传递,根本不需要你在选择器里写出来。

再举个多参数的例子加深理解:如果你的方法是

-(void)onClick:(id)sender withIndex:(NSInteger)index{
    // 实现代码
}

那对应的选择器就是@selector(onClick:withIndex:)——两个冒号对应两个参数,同样不需要写(id)sender或者(NSInteger)index这些内容。

内容的提问来源于stack exchange,提问作者Ran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:05:18