OC protocol

 1 - 什么是协议?

   一些方法的声明,一般写到一个.h的头文件中

   方法有两种:

    1) 必须实现   (@required  修饰  )

    2) 选择实现(可以不实现)    (@optional  修饰  )

 2 - 协议的作用:

    供其他的类去遵守,如果一个类遵守了一个协议,就应该实现这个协议中定义的必须要实现的方法

 3 - 如何定义一个协议:

    @protocol xxx <NSObject>  默认情况下遵守 NSObject协议

    @end

 4 - 类遵守协议的格式:

    1) 遵守一个协议:

     先导入头文件

     @interface 类名 :NSObject <xxx>

       @end

    2) 遵守多个协议

      @interface 类名 :NSObject <xxx,aaa,bbb>

      @end

例子:

@protocol  AnimalProtocol <NSObject>  //默认情况下遵守NSObject


遵守协议的步骤:

1)导入头文件  (导入协议)

2)遵守协议

3)实现协议中方法


protocol的使用注意

    protocol就一个用途,用来声明一大堆的方法(不能声明成员变量),不能实现.

 1)一个协议,可以遵守其他的协议

 2)一个类可以遵守多个协议

 3)一个协议可以被多个类遵守


protocol基协议:

        1>NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它

        2>其实还有一个协议,名字也叫NSObject,它是一个基协议,最根本最基本的协议

        3>NSObject协议中声明很多最基本的方法,比如description、retain、release等  

        4>建议每个新的协议都要遵守NSObject协议

        5>定义变量时指定协议

@required 和 @optional 都是协议中的关键字

@required 修饰的方法是必须要实现的

@required    //默认情况下都是必须要实现的

@optional 修饰的方法是可以实现,也可以不实现的


protocol类型限制

id和instancetype都可以用来作为函数返回值

id可以用来定义变量,instancetype不能,instancetype可以准确区分类型


protocol代理设计模式

一些注意的地方

1.就是用来声明一大堆方法,且,只能声明方法,变量不行

2.凡是遵守了这个协议,就相当于拥有了这个协议的所有方法

3.父类遵守了某个协议,子类自动也遵守

4.公共方法可以抽取为协议,用来实习复杂设计模式

5.协议不一定非要定义在单独文件中,也可以直接写在某个类的.h文件中。规则:

当某个协议只是为了给某个类单独去遵守,就可以写在类里面,否则写在单独文件中。




  
  
  1. //  有一个Baby类,有Cry行为(方法,意为“哭”),Baby可以配一个保姆,但是作为保姆,必须遵守保姆协议:能够处理Baby类Cry的行为。请根据以上描述设计一套代理设计模式(Objective-C)
  2. main.m
  3. #import <Foundation/Foundation.h>
  4. #import "BaoMu.h"
  5. #import "Baby.h"
  6. int main(int argc, const char * argv[]) {
  7.    @autoreleasepool {
  8.        
  9.        BaoMu *baomu = [BaoMu new];
  10.        Baby *baby = [Baby new];
  11.        baby.blood = 30;
  12.        baby.sleep = 20;
  13.        
  14.        baby.bm = baomu;
  15.        [baby wantEat];
  16.        [baby wantSleep];
  17.        NSLog(@"%.2f,%.2f",baby.blood,baby.sleep);  
  18.    }
  19.    return 0;
  20. }
  21. //  Baby.h
  22. #import <Foundation/Foundation.h>
  23. @class BaoMu;
  24. #import "lookBabyProtocol.h"
  25. @interface Baby : NSObject
  26. @property (nonatomic,assign) float blood;
  27. @property (nonatomic,assign) float sleep;
  28. //保姆、体力值、睡眠值
  29. @property (nonatomic,strong) BaoMu<lookBabyProtocol> *bm;
  30. -(void)wantEat;
  31. -(void)wantSleep;
  32. @end
  33. //  Baby.m
  34. #import "Baby.h"
  35. #import "BaoMu.h"
  36. @implementation Baby
  37. -(void)wantEat{
  38.    NSLog(@"婴儿在哭...");
  39.    //保姆要喂它吃
  40.    [self.bm feedBabyEat:self];
  41. }
  42. -(void)wantSleep{
  43.    NSLog(@"婴儿在哭...");
  44.    //保姆哄婴儿睡觉
  45.    [self.bm HongBabySleep:self];
  46. }
  47. @end
  48. //  Baomu.h
  49. #import <Foundation/Foundation.h>
  50. //保姆想成为baby的代理人,就必须遵守lookBabyProtocol协议
  51. #import "lookBabyProtocol.h"
  52. @interface BaoMu : NSObject<lookBabyProtocol>
  53. @end
  54. //  Baomu.m
  55. #import "BaoMu.h"
  56. #import "Baby.h"
  57. @implementation BaoMu
  58.     //喂婴儿吃饭
  59. -(void)feedBabyEat:(Baby *)baby{
  60.    baby.blood += 20;
  61.    NSLog(@"保姆正在喂婴儿吃东西,baby.blood = %.2f",baby.blood);
  62. }     //哄婴儿睡觉
  63. -(void)HongBabySleep:(Baby *)baby{
  64.    
  65.    baby.sleep += 10;
  66.    NSLog(@"保姆正在哄婴儿睡觉,baby.sleep = %.2f",baby.sleep);  
  67. }
  68. @end
  69. //  lookBabyProtocol.h
  70. #import <Foundation/Foundation.h>
  71. @class Baby;
  72. @protocol lookBabyProtocol <NSObject>
  73.  //喂婴儿吃饭
  74. -(void)feedBabyEat:(Baby *)baby;
  75.  //哄婴儿睡觉:(Baby *)baby
  76. -(void)HongBabySleep:(Baby *)baby;
  77. @end


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值