objective-c protocol协议

作用:声明一些方法

定义
@protocol 协议名称
//方法声明列表
@end
类遵守协议
  • 一个类可以遵守一个或者过个协议

  • 任何类只要遵守了protocol,就相当于拥有了protocol的所有方法声明

     @interface 类名 : 父类 <协议名称1,协议名称2,...>
     @end
    
和继承的区别
  • 继承之后就默认实现,protocol只有声明
  • protocol可以用来储存方法的声明,可以将多个类共同的方法抽取出来
  • 相同类型的类可以继承,但是不同类型的类只能用protocol
注意
  1. 协议只能声明方法,不能声明成员变量
  2. 子类会遵守父类遵守的协议
  3. OC中可以遵守多个协议(OC只能单继承,也就是不能继承多个父类)
  4. OC中的协议可以遵守其他协议,该协议就会自动包含遵守协议的声明
基协议

NSObject是基协议
建议每个新的协议都要遵守NSObject协议,但不遵守也没问题

@required和@optional
  • @required:这个方法必须要实现,如果没有关键字修饰协议中的方法,该方法就默认是required。如果没有实现该方法,就会报一个警告,仅用于程序员之间的交流,不会运行错误
  • @optional:方法不一定要实现
@protocol protocolName 

@required //不实现方法会报警告
- (type)funname;
@optional //不实现不会报警告
- (type)funname;
协议的应用场景
  • 将协议写在数据类型右边,明确的标注如果想要给该变量赋值,那么该对象就必须遵守某个协议

    数据类型<协议名称> 变量名
    

//如果没有遵守协议就会报警告
classname *p = [[classname alloc] init];
```
- 注意:虽然在接受某一对象的时候,对这个对象进行了类型限定(限定他必须实现某个协议),但是并不意味着这个对象就真正的实现了该方法,所以每次在调用对象的协议方法时应该进行一次验证

  • 代理设计模式:类似于代理网点
    • 当A对象想要监听B对象的一些变化时
    • 当B对象发生变化,想通知A对象的时候
    • 让B对象成为A对象的代理对象,A无法处理一些行为时,B可以
    • 一般情况下,协议书与谁,协议就定义在谁的头文件
    • 协议名称一般以他属于那个类的类名开头,后面加上protocol或者delegate
    • 协议中方法的名称一般以协议的名称protocol之前的作为开头
    • 一般情况下协议中的方法会触发协议的对象传递出去
    • 一般情况下一个类中的代理的名称叫做 delegate
    • 当某一个类要成为另一个类的代理的时候
      • 一般情况下在.h用@protocol 协议名称; 告诉当前类这是协议
      • 在.m中用#import真正导入一个协议的声明

你可能感兴趣的:(objective-c protocol协议)