selector是一个用来 选择出对象要执行的方法 的名字,在源码编译后,是代替名字的一个唯一标记(unique identifier)。selector自己不会做任何事情,它只是标记一个method(It simply identifies a method)。编译器之所以不用字符串表示selector是为了确保selector名字的唯一性。在运行时(runtime)中,selector扮演动态函数指针的角色,对于一个给定的名称,自动的指向method作用的类对应的method的实现(implementation)。假设有一个run方法(method)的selector,和实现了run方法的三个类Dog,Athlete,ComputerSimulation。selector可以被任何这三个类的实例调用,即使他们的实现是不相同的。
张小明注:很多书籍将selector解释为选择器,但是从功能上来看,小明觉得翻译成选择标记可能更准确。这里直接使用selector,method英文,便于读者理解和区分selector和method的不同。
Getting a Selector
编译后的selector的类型为SEL。有两种常见的方式获取到selector:
@1在编译时(compile time),使用@selector指令
SEL aSelector = @selector(methodName);
@2在运行时(runtime),使用NSSelectorFromString函数,参数string是方法的名字
SEL aSelector = NSSelectorFromString(@"methodName");
当方法的名字直到运行时(runtime)才能获取时,就可以以这种方式发送消息
Using a Selector
我们可以通过performSelector:的方式调用一个方法,或者其他类似的方法
SEL aSelector = @selector(run);
[aDog performSelector:aSelector];
[anAthlete performSelector:aSelector];
[aComputerSimulation performSelector:aSelector];
(只有在特殊的情况下才会使用这种方式,例如用target-action设计模式实现的对象。通常情况下,只需要单纯的调用方法即可)
网友评论