selector 与 动态绑定

来源:互联网 发布:常见的网络协议有哪些 编辑:程序博客网 时间:2024/06/11 16:26

selector

什么是 selector

当你要执行一个对象的方法时,一个selector就是用来选择这个方法的名字的,或者说资源文件被编译时方法的唯一标识。一个selector本身什么也做不了。它只是简单地标明一个方法。唯一使得selector方法名字和普通字符串不同的是,编译器能够确保selector方法名是唯一的。当与runtime结合使用的时候,selector就很有用了,它就像一个拥有特定名字的动态方法的指针,自动指向了任何它被使用到的类的方法的实现。假设你有一个run方法的selector。类“Dog”,”Athele”,”CompluterSimulator”(他们都实现了run方法)。这个selector可以和任何这些类的实例配合使用来援引他的run方法-即使他们各自的实现都不相同。

怎样得到一个 selector

编译时的selector是sel类型的,有两种方法来获得selector:在编译时期,你可以使用编译命令@selector

SEL Sselector = @selector(methodName);

在运行时,你可以使用NSSelectorFromString方法,这个字符串就是方法的名字

SEL aSelector = NSSelectorFromString(@"methodName");

当你想用你的代码发送消息给一个直到运行时才能直到名字的方法时,你可以通过字符串来创建selector

使用selector

你可以使用performSelector来调用一个selector对应的方法

SEL aSelector = @selector(run);[aDog performSelector:aSelector];[anAthlete performSelector:aSelector];[aComputerSimulation performSelector:aSelector];

(这种技术在特殊情况下会用到,例如你使用 target-action设计模式实现了一个对象,通常情况下,都会直接调用方法。)

动态绑定

动态绑定决定了运行时调用的方法而非编译时。动态绑定也被叫做延迟绑定。在 Objective-C ,所有的方法都在运行时动态被决定的。要执行的代码是由方法名字(selector)和接收消息的对象共同决定的。

动态绑定激活了“多型”。例如,考虑一系列对象“Dog”“Athele”“ComputerSimulation”.每个对象都有自己的特有的run方法的实现。在下面的代码块中,[anObject run]表达式实际被执行的代码是在运行时决定的。运行时系统使用run方法的selector来辨别合适的方法。无论这个anObject是什么类。

NSArray *anArray = [NSArray arrayWithObjects:aDog, anAthlete, aComputerSimulation, nil];id anObject = [anArray objectAtIndex:(random()/pow(2, 31)*3)];[anObject run];
0 0