ReactiveCocoa的rac_signalForSelector实现原理

ReactiveCocoa可以給一个方法的调用添加绑定,或者说是观察者。

rac_signalForSelector:fromProtocol:(绑定协议的方法)

rac_signalForSelector:(绑定类的方法)

原理:

  1. 在当前类中设置关联属性,value:RACSubject
  2. 将传入selector的方法的实现设置成_objc_msgForward(目的是让这个方法调用走方法的转发流程)
  3. 为“当前类”重写或添加respondsToSelector:方法,检查关联属性是否存在,存在:返回YES,方法转发进入下一步
  4. 为“当前类”重写或添加methodSignatureForSelector:方法,构建方法签名
  5. 为“当前类”重写或添加forwardInvocation:方法,1):检查方法可以调用,执行方法的invoke;2):获取类的关联属性,执行RACSubject的sendNext,将invocation中的方法参数封装到RACTuple中,作为sendNext参数。

之所以让所有的方法调用统一走方法转发流程,目的就是可以方便的在invocation对象中获取方法的参数。

 注意点:

上面所说的 “当前类” ,并不是实际代码中实例化的类,而是我们动态创建了一个类A,并继承这个类,然后将这个类的isa指针设置成类A(这里就是采用KVO的实现原理)。

因为这个类有可能添加了KVO实现,那么这个类的isa指针也就不是self.class所指向的类了,这时我们需要在这个类的isa指针所指向的类中重写或添加以上方法。

其实KVO的设计模式就是采用类簇的方式实现的,可以了解一下类簇

猜你喜欢

转载自www.cnblogs.com/zbblog/p/12540628.html