ReactiveCocoa的rac_signalForSelector实现原理
ReactiveCocoa可以給一个方法的调用添加绑定,或者说是观察者。
rac_signalForSelector:fromProtocol:(绑定协议的方法)
rac_signalForSelector:(绑定类的方法)
原理:
- 在当前类中设置关联属性,value:RACSubject
- 将传入selector的方法的实现设置成_objc_msgForward(目的是让这个方法调用走方法的转发流程)
- 为“当前类”重写或添加respondsToSelector:方法,检查关联属性是否存在,存在:返回YES,方法转发进入下一步
- 为“当前类”重写或添加methodSignatureForSelector:方法,构建方法签名
- 为“当前类”重写或添加forwardInvocation:方法,1):检查方法可以调用,执行方法的invoke;2):获取类的关联属性,执行RACSubject的sendNext,将invocation中的方法参数封装到RACTuple中,作为sendNext参数。
之所以让所有的方法调用统一走方法转发流程,目的就是可以方便的在invocation对象中获取方法的参数。
注意点:
上面所说的 “当前类” ,并不是实际代码中实例化的类,而是我们动态创建了一个类A,并继承这个类,然后将这个类的isa指针设置成类A(这里就是采用KVO的实现原理)。
因为这个类有可能添加了KVO实现,那么这个类的isa指针也就不是self.class所指向的类了,这时我们需要在这个类的isa指针所指向的类中重写或添加以上方法。
其实KVO的设计模式就是采用类簇的方式实现的,可以了解一下类簇。
要得到你必须要付出,要付出你还要学会坚持,如果你真的觉得很难,那你就放弃,但是你放弃了就不要抱怨,我觉得人生就是这样,世界真的是平等的,每个人都要通过自己的努力,去决定自己生活的样子。