id类型的成员属性->协议->告诉对应对象应该实现哪些方法
自己调用方法,然后由代理对象实现-> respondsToSelector:@selector( )
如果方法可选实现,就加一个判断声明一个代理分为三步:
①.声明协议->告诉对应的对象,该实现哪些方法
②.声明一个id类型的成员属性(weak修饰) ->不限制调用方法的对象类型(任意对象都可以实现对应的方法)
id<协议名> -> 仅仅是为了告诉别人对应的协议是哪一个
③.自己调用自己协议的方法
关键: respondsToSelector:@selector( ) 判断代理对象能否响应代理中的方法
是否添加判断的依据是根据协议中方法的标识 :
@optional -->要加
@required -->不要加(如果方法前不加关键字修饰,默认必须实现)
如果对应对象没有实现就会报错
- 使用代理:
①.设置代理对象 ⬇️
②.遵循协议 ⬆️ 不遵循协议同样可以实现代理方法,只是在实现方法书写时,不会智能提示出方法,需要手写
本质( 写协议 ->告诉对应对象应该实现哪些方法)
协议命名通常有一个特点: 类名 + 代理的名字(成员属性的名字)
③.实现方法
需要注意的是:
- 在OC中遵循协议时可以写基协议甚至不遵循协议都是没有问题的,只是不遵循协议在实现代理方法时没有智能提醒,只能靠手敲
- 而Swift更为严谨,如果不遵循协议或者写成基协议都是不允许的,直接会报错
比如使用UICollectionView时,为了监听滚动,设置代理后,遵循了UIScrollViewDelegate协议,就会报错
必须要写成:
extension JSEmoticonKeyBoardView: UICollectionViewDelegate