在Objective-C中,选择器selector有两种含义。其一是当在源代码中向一个对象发送消息时,用它来引用一个方法的名字;其二是当源代码编译过后,用它来引用取代名字的唯一标识符。编译后的选择器类型为SEL。所有相同名字的方法都有相同的选择器。你可以使用选择器来调用对象的方法——这为在Cocoa中实现target-action设计模式打下了基础。
方法和选择器
为了提高效率,在编译后的代码中,方法选择器不会使用完全ASCII名字。编译器将每个方法的名字写入一张表,然后将该名字与该方法在运行时的唯一标识符配对。运行时系统确保每个标识符都是唯一的:不存在相同的两个选择器,同名的所有方法都有相同的选择器。
SEL和@selector
编译后的选择器被赋予一个特殊类型,SEL,以区别于其他数据。有效的选择器永远不会为0。你必须让系统来给方法赋予SEL标识符,对它们的随意指定是无效的。
@selector指令可以用来引用编译后的选择器,不采用方法的完全名字。下例中,setWidth:height:的选择器被赋给了setWidthHeight变量:
- SEL setWidthHeight;
- setWidthHeight = @selector(setWidth:height:);