相较于C++的函数调用方式 OC采用的是消息传递
下面我们来对两种方式做一个类比
在函数调用中如果要使用一个函数,一般是将参数压入栈 再寻找函数地址 将参数从栈中拿出 得出结果再返回原来运行处 再进行调用。或者是在编译时就将代码在调用处展开
而消息传递是不管你是否多态,总是在运行时才会去查找所要执行的方法。
所以使用消息结构的语言,其运行时所应执行的代码由运行环境来决定;而使用函数调用的语言则由编译器决定
向一个对象发送消息时简单的代表了一个方法名 比如[a func]此时func是选择器
当源代码编译时选择器会被指向一个唯一标识(SEL)以代替方法名 此时SEL是选择器
主要是为了更快编译
SEL就是消息选择器 SEL s1 = @selector(func); // @selector()就是引用编译后的选择器
出于运行效率的考虑,在编译后的代码中不会使用有ASCII码组成的方法名,
取而代之的是,编译器会将每个方法名写到一张表去,然后为每个方法名分
配一个唯一标识用于在运行时标识一个方法
SEL sor; (sor就是消息选择器 也可以看作唯一标识)
-(void)who:(int)n;
sor = @selector(who:);
注意!这个sor标识的只是方法名!并不是指定了就是这个方法实现