先不管什么语言,我们先想象一种编程场景,A类中创建了一个B对象,A和B之间要怎么通信呢?A要主动和B通信没有问题,因为B是在A中创建的,A自然拥有B的引用,能知道B的可用的方法,调用B的方法,就可以和B通信了。可是B要怎么和A通信呢?那么B也要有A的引用,调用A的方法通信。
这种通信方式,如果A和B都是自己写的代码,这样没有问题。可是,B是一个库代码,将来可以给别人用,A和B通信没问题,因为,你集成B的库后,可以直接调用B的方法。可是B要和未来的A通信怎么弄呢?要解决这个问题,B就需要定义出,B主动和未来A通信的规范,未来的A实现了这个规范,B就可以和未来的A通信了。
在java中B定义的规范是通过interface来实现的,就是监听器。
在OC中是通过协议代理实现的。
其实思想是一样的,B中定义了interface,A实现了这个interface,然后把this传给了B,这里用到了多态,这样B就可以通过this,和A通信了。从协议代理的角度来说,B定义的interface是协议,A实现了这个协议,这样A就代理了B的一部分功能。
不过,在Java中,A有可以有内部类或者匿名内部类实现inteface,然后把内部类的实例传给B,因为内部类是自动捕获A的引用的,所以,这样B也能和A通信。不知道OC中能不能这样搞。
还有一个概念就是监听器/协议代理是实现MVC框架的基础。
上面提到,java使用匿名内部类的方式,其实OC中有相应的替代,就是Block(匿名函数),Block加OC 的属性使用,很方便,很好用。
比如,一个点击时间的block
@property(nonatomic, copy) void(^onLocalPlayBtnClick)(void);