何时使用带@selector的冒号

时间:2011-02-10 05:13:27

标签: ios objective-c iphone selector nsnotifications

开始使用iPhone开发和Objective-C

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

unrecognized selector sent to instance

我追踪到的事实是我需要将尾部冒号包含在我的选择器参数中:

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

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

但是,使用以下代码:

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

我得到完全相同的错误:

unrecognized selector sent to instance

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

谢谢!

6 个答案:

答案 0 :(得分:30)

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

@selector(method)会期望该方法:-(void)method

@selector(method:)会期望该方法:-(void)method:(id)someParameter

答案 1 :(得分:8)

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

-(IBAction) doIt:(id)sender;

的名称为doIt:。因此,应该使用冒号来引用这种方法 但是这种方法最后没有冒号

-(IBAction) doItWithoutParameter;

同样适用于接受多个参数的方法,它们的名称类似于doItWithParam1:andParam2:

答案 2 :(得分: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];
  4. 等等。

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

    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];

答案 3 :(得分:2)

冒号表示该方法采用参数。

[someObject performSelector:@selector(doSomething:)]表示doSomething期待参数。

[someObject performSelector:@selector(doSomething)]表示doSomething不需要任何参数。

答案 4 :(得分:2)

在你的情况下:

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

- (void) nameOfMySelector: (NSNotification *) notification {
    /* this method would require the semi-colon */
}

或在这种情况下:

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

- (void) nameOfMySelector: (id) sender {
    /* this method would also require the semi-colon */
}

答案 5 :(得分:0)

我认为问题是缺少参数。

看到这篇文章:Objective-C: Calling selectors with multiple arguments(很棒的答案!)