何时使用带@selector的冒号

dji*_*i33 12 iphone objective-c selector nsnotifications ios

刚开始使用iPhone开发和Objective-C.

昨天我试图在我的视图中添加Observer以获取通知,并且我一直收到此错误:

unrecognized selector sent to instance

我追踪到这个事实,我需要将尾随冒号包含在我的selector参数中:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(nameOfMySelector:) name:@"BBLocationServicesAreDisabled" object:nil];

今天,我觉得我很聪明,因为在设置按钮的动作参数时,我记得我昨天的错误,并将冒号添加到动作参数中.action参数采用a @selector,就像设置一个观察者的选择器参数一样NSNotification,所以我认为我做的是正确的.

但是,使用以下代码:

[self.callToActionButton addTarget:self action:@selector(nameOfMySelector:) forControlEvents:UIControlEventTouchUpInside];

我得到完全相同的错误:

unrecognized selector sent to instance

是什么赋予了?为什么@selector需要一个尾随冒号,另一个不需要?我应该遵循哪些规则应该包含哪些内容以及什么时候应该保留,以及为什么我不能总是只做一个或另一个?

谢谢!

rcw*_*cw3 30

正如boltClock所提到的,你所指的字符实际上是冒号.@selector(method)和之间的区别@selector(method:)是方法签名.第二个变体需要传递参数.

@selector(method) 期待这个方法: -(void)method

@selector(method:) 期待这个方法: -(void)method:(id)someParameter

  • 我们去了,就是这样.完全有道理.感谢快速回答和语法课:) (3认同)

Nik*_*bak 8

你似乎在这里缺少一个概念:冒号在某种程度上是方法名称的一部分.例如,方法

-(IBAction) doIt:(id)sender;
Run Code Online (Sandbox Code Playgroud)

有名字doIt:.因此,应使用冒号来引用此方法.
但是这种方法最后没有冒号

-(IBAction) doItWithoutParameter;
Run Code Online (Sandbox Code Playgroud)

接受多个参数的方法也是如此,它们的名称相似 doItWithParam1:andParam2:


小智 6

选择器表示方法名称,选择器中的冒号数与相应方法中的参数数相匹配:

  1. mySelector- 没有冒号,没有参数,例如- (void)mySelector;,[self mySelector];
  2. mySelectorWithFoo:- 一个冒号,一个参数,例如- (void)mySelectorWithFoo:(Foo *)foo;,[self mySelectorWithFoo:someFoo];
  3. mySelectorWithFoo:withBar:- 两个冒号,两个参数,例如- (void)mySelectorWithFoo:(Foo *)foo bar:(Bar *)bar;,[self mySelectorWithFoo:someFoo bar:someBar];

等等.

也可以选择没有"命名"参数的选择器.不建议这样做,因为它不能立即清楚参数是什么:

  1. mySelector::- 两个冒号,两个参数,例如- (void)mySelector:(Foo *)foo :(Bar *)bar;,[self mySelector:someFoo :someBar];
  2. mySelector:::- 三个冒号,三个参数,例如- (void)mySelector:(int)x :(int)y :(int)z;,[self mySelector:2 :3 :5];