选择器(selector)只是一个方法名称,但是它以Objective-c运行时使用的特殊方式编码,以快速执行查询。你可以使用@selector()编译指令圆括号中的方法名称来指定选择器。
因此,Car类的setEngine:方法的选择器是:
@selector(setEngine:)
而Car类的setTire: atIndex: 方法的选择器如下所示:
@selector(setTire: atIndex:)
NSObject提供一个名为respondsToSelector:的方法,该方法询问对象以确定其是否能够响应某个特定的消息,例如
if([ car respondsToSelector: @selector(setEngine:)])
{
// do something
}
SEL and @selector
selector编译后被指定到一种特殊的类型——SEL来与其它类型进行区分。有效的selector永远不会为0.你必须让系统给方法分配SEL标示符,自行任意分配的标示符是无效的。
你应该使用@selector()指令将方法名传递给编译的selector,而不是直接使用一个方法的全名。比如,下面的方法可以获得setWidth:height: 方法的selector,并且分配给setWidthHeight变量:
SEL setWidthHeight;
setWidthHeight = @selector(setWidth:height:);
最有效的的方式是在编译的时候调用@selector()指令给SEL变量赋值。但在有些情况下,你可能需要在运行时候将字符串转换给某个selector。你可以使用NSSelectorFromString函数完成这项工作:
setWidthHeight = NSSelectorFromString(aBuffer);
选择器可以被传递,可以作为方法的参数使用,甚至可以被作为实例变量被存储。