黑马程序员——OC语言Protocol(协议)

来源:互联网 发布:快手喊麦都用什么软件 编辑:程序博客网 时间:2024/05/16 11:15
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------
0.概念
   1>协议(Protoco)是一系列方法的列表,其声明的方法可以被任何类实现,一般称为代理模式。
   2>在.h文件中@protocol声明存在协议,跟@class一样

1.作用:
   1>可以声明很多方法,但是不能声明成员变量。
   2>如果某个类遵守了某个协议,则这个类拥有协议中的所有方法声明。
   3>如果父类遵守了某个协议,则子类也遵守了这个协议,

2.基本语法
   1>定义协议
    // 定义一个协议,协议名称是myprotocol,NSObject是基协议,每个协议必须遵守
@protocol myprotoco <NSObject>     - (void)test; // 声明test方法     - (void)test2;  // 声明test2方法    @end

   2>协议关键词
@required:要求方法必须实现,比实现就会发出警告,默认此
@optional: 不要求一定实现

  eg:   
@protocol myprotoco        @required         - (void)test; // 声明@required类型test方法,且要求此方法必须实现          @optional       - (void)test2;  // 声明@optional类型test2方法,不一定要求此方法实现      @end

   3>如何遵守协议
 (1)类遵守协议
  @interface 类名:父类名 <协议名称1,协议名称2>
  @end
eg:@interface Person : NSObject <protocol1,procotol2 >         @end

  (2)协议遵守协议。
   @protocol 协议名 <协议1,协议2>
   @end

3.基协议
  (1)NSOBject是基协议,最根本最基本的协议。
  (2)建议每个新协议都遵守基协议NSObject协议。

4.限制这个对象遵守协议
    类名<协议名称> *变量名; eg:NSObject<myprotocol> *obj; // obj对象遵守myprotocol协议
    id<协议名称> 变量名; eg:id<myprotocol> obj2;
eg:NSObject<myprotocol> *obj2 = [[Person alloc] init];              // 等号右边的Person类也必须遵守此协议,在Person类中需指定遵守此协议</span>

5.@property中声明的属性遵守协议
    @property (nonatomic,strong) 类名<协议名称> *属性名
eg: @property(nonatomic,strong) Person<myprotocol> *p; // p属性遵守myprotocol这个协议</span>
    @property (nonatomic,strong) id<协议名称> 属性名

6.协议可定义在单独的.h文件中,也可定义在某个类的.h文件中
  (1)如果这个协议只能用于某个类,则此协议定义在此类的.h文件中
           eg:如果myprotocol1协议只用能在Person类中,则此 协议需要定义在Person类的.h文件中

  (2)如果这个协议需要多个类使用,则此协议定义在单独的.h文件中
           eg:如果myprotocol1协议要被多个类同时使用,则需要将此协议单独定义在协议的.h

7.分类可定义在单独.h和.m文件中,也可定义在原来类中
  (1)一般定义在单独.h和.m文件中
  (2)定义在原来类中的分类,只要求能看懂语法

8.代理设计模式
   定义:为其它对象提供一种代理以用来控制这个对象,我们不关心代理如何完成的,只关心代理有没有完成。
     eg: 小明不想做饭,因此请了个保姆,但是请保姆需要签一份协议,保姆需要遵守协议。所以保姆就是代理,代理需要遵守某个协议。
   条件:如果要成为代理,则必须遵守某个协议协议用于声明方法,限制代理必须拥有某个方法)。
   作用:可以监听某个方法是否被触发。
   优点:耦合性较低,增加了代码的弹性。
       eg:代理被删除了,但是Person还在。代理和对象之间互不影响。

9.总结
   可以在某个文件中声明很多方法,方便多个类调用。
     例如如果有很多类都需要某个方法,这样的话这些类都可以遵守这个协议,就不需要在每个类中编写相同的方法。提高了程序编写效率。
0 0