Objective-C Selector

Selector

在Objective-C中,selector有两个意思, 当用在给对象的源码消息时,用来指方法的名字。
它也指那个在源码编译后代替方法名的唯一的标识符。 编译后的选择子的类型是SEL
有同样名字的方法 也有同样的选择子。你可以使用选择子来调用一个对象上的方法

SEL和@selector

编译后的选择子 被设置为一个特殊的类型 SEL,它用来同其他数据区分开来。有效的选择子永远都不会是0
你必须让系统设置SEL标识符给方法,自己随便设置是无效的

编译器指令@selector()让你引用编译后的选择子,而不是完整的方法名。
这里,setWidth:height:的选择子被设置给setWidthHeight变量:

SEL setWidthHeight;
setWidthHeight = @selector(setWidth:height:);

在编译时设置变量为SEL变量最有效的方法就是@selector()指令。然而,在某些情况下,你可以需要在运行时转换一个字符串为一个selector。用NSSelectorFromString可以做到:
setWidthHeight = NSSelectorFromString(aBuffer);

作一个反向转换也是可能的,NSStringFromSelector函数就是将selector转换为函数名:
NSString * method;
method = NSStringFromSelector(setWidthHeight);

方法和选择子
编译后的选择子 识别方法名,而不是方法的实现。某一个类的display方法,有一个同样的选择子 叫做display的方法,定义在另外的类中。这就是多态和动态绑定的精要。它让你发送同样的消息 给不通的类的接收者。如果一个选择子有不同的实现,那么消息将是不同的函数调用。

同名的类方法和实例方法被设置为同样的选择子。 然而,因为它们不同的域(domain),不会在它们之间产生混淆。一个类可以定义一个display的类方法,并且定义一个display的实例方法。

Objective-C Selector》上有1条评论

  1. willonboy's blog

    我比较赞同我在另一篇文章中对SEL与selector的解释
    @selector()获取的应该是一个函数的入口地址 也即获取函数指针 而SEL是存入函数指针指向的值 或许还存放了函数编译后的唯一标识什么的

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注