OC中的id类型很特殊,用id类型定义的变量,将不会进行静态类型检查,而是在运行时才确定类型。如果类中有重载的方法(方法名一样,也就是参数个数也一样,参数类型不一样),因为编译时候会将方法名转换成SEL类型的变量,每个方法名的SEL类型变量或者说标志都是唯一的,如果类中有相同的方法名,编译器肯定要报错,这是要确保方法的SEL类型的标识符的唯一性。保证唯一性目的是什么呢?因为编译器会把消息发送,转成函数调用,函数调用中会传入接收消息的对象和消息名(即方法名)的SEL类型变量,以及消息中的参数。运行时运行时系统会确定对象的实际类型时,会根据对象的isa指针定位它的类对象,从类对象中搜索有没有SEL类型标示的方法,没有,就到对象的类对象的父类对象中搜索,一直搜索到类对象NSObject中。如果发现一个类对象中存在多个同名的方法但是参数类型不一样,它怎么确定用哪个呢?所以方法签名从编译时到运行时都要是唯一的。 |