开始使用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
需要一个尾随冒号,另一个不需要?我应该遵循哪些规则应该包含哪些内容以及什么时候应该停止,为什么我不能总是只做一个或另一个?
谢谢!
答案 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)
选择器表示方法名称,选择器中的冒号数与相应方法中的参数数相匹配:
mySelector
- 没有冒号,没有参数,例如- (void)mySelector;
,[self mySelector];
mySelectorWithFoo:
- 一个冒号,一个参数,例如- (void)mySelectorWithFoo:(Foo *)foo;
,[self mySelectorWithFoo:someFoo];
mySelectorWithFoo:withBar:
- 两个冒号,两个参数,例如- (void)mySelectorWithFoo:(Foo *)foo bar:(Bar *)bar;
,[self mySelectorWithFoo:someFoo bar:someBar];
等等。
也可以选择没有“命名”参数的选择器。不建议这样做,因为它不能立即清楚参数是什么:
mySelector::
- 两个冒号,两个参数,例如- (void)mySelector:(Foo *)foo :(Bar *)bar;
,[self mySelector:someFoo :someBar];
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(很棒的答案!)