objective-c笔记:响应选择器

选择器(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);

 

 

选择器可以被传递,可以作为方法的参数使用,甚至可以被作为实例变量被存储。