OC是基于消息机制的
函数在执行时,会把类名作为一个字符串消息发送给某个内存地址,如果内存地址的类中有同名的函数,就会执行
这也是为什么OC没有办法重载的原因,因为每个参数都用:代表,所以如果函数名一样,参数一样都为两个,那么生成的字符串都是**FunctionName::**,在具体执行时就会重名,无法判断
协议Protocol是如何实现的
协议中有代理Delegate和Protocol
A类中声明Protocol的人定义函数名,说我会使用一个叫什么名字的函数
B类中遵循Protocol的人需要实现Protocol中的函数,这就使得实际对象的内存地址有了该函数名
A类需要使用Protocol的人会设置一个weak类型id
delegate的属性 delegate只不过是大家约定俗成这么叫,实际上就是一个任意的遵循Protocol协议的弱指针,weak指针是为了防止循环引用
在setDeleagte的时候就是把执行者B设置成delegate,相当于把类B实际的内存地址给了A,让A可以访问
那么A.delegate执行Protocol时就是把1-2步中约定好的函数名发送给A,A中实际存在,就会执行,不存在就会崩溃
那么消息和Selector是否必须遵循Protocol实现呢
答案是不用的
Selector消息可以被发送给任意内存地址,也就是说只要类A可以拿到内存地址,就可以给该内存地址发送消息,例如给childViewController给自己的parentViewController发送消息
child(子)并不关心自己的parent(父窗口)是谁,只要其相应某个函数名,就可以让他执行,但是前提是知道函数名
1 | SEL selector = NSSelectorFromString(@"offsetChildViewController:"); |