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
相关产品推荐
相关产品推荐

