2011-02-10 66 views
12

刚开始使用iPhone开发和Objective-C。何时用@selector使用冒号

昨天我在想的addObserver在我的观点的通知,我不断收到此错误:

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

是怎么回事?为什么一个@选择器需要一个尾部冒号,而另一个却不需要?我应该遵循什么规则,什么时候应该包括什么规则,什么时候应该停止规则,为什么我不能总是只做一个或另一个?

谢谢!

+1

这是一个冒号,而不是分号。无论如何,你的`nameOfMySelector:`方法的原型是什么?它想要什么样的论据? – BoltClock 2011-02-10 05:14:32

+0

你是否也指两种情况下的相同方法? – BoltClock 2011-02-10 05:27:01

回答

29

名正如boltClock提到的,你是指性格其实是一个冒号。 @selector(method)@selector(method:)之间的区别是方法签名。第二个变体需要传递参数。

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

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

8

您似乎错过了一个概念:冒号在某种程度上是方法名称的一部分。例如,方法

-(IBAction) doIt:(id)sender; 

有名称doIt:。因此,冒号应该被用来引用这个方法。
但这种方法并没有在最后

-(IBAction) doItWithoutParameter; 

也是一样的方法接受多个参数有一个冒号,他们有像doItWithParam1:andParam2:

2

冒号表示该方法需要一个参数。

[someObject performSelector:@selector(doSomething:)]意味着doSomething需要一个参数。

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

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

一个选择代表的方法名称,冒号的一个选择的号码匹配的参数在相应的方法数:

  1. mySelector - 没有冒号,没有参数,例如- (void)mySelector;[self mySelector];
  2. ​​3210 - 一个冒号,一个参数,例如- (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];