IOS学习笔记之协议与委托

1、协议(Protocol)的概念

    协议是定义了一组方法,让其他类遵守(实现)。协议本身不是类,协议的定义看起来比较类似一个类的接口(.h文件),不同的是协议没有父类也不能定义实例变量,它只能定义方法。

    只要一个类遵守了一份协议,就拥有了这份协议中所有的方法声明。OC中不能直接继承多个父类但是可以实现多个协议。

2、协议的格式

    (1)定义协议

     @protocol 协议名称

     //定义一组方法

    @end

   (2)实现协议

    @interface  类名:父类名<协议名称>

    @end

    (3)协议的两个属性

    @required(默认):表示必须实现的方法

    @optional:表示可选的方法

3、协议的使用

   (1)定义一个协议  

@protocol ArchProtocol <NSObject>

@required

-(void)shoot;//士兵射击

@end

    (2)定义几个类实现上述协议

//初级弓箭手

@interface StudentArchMan : NSObject<ArchProtocol>

@end

@implementation StudentArchMan

-(void)shoot{

    NSLog(@"见习弓箭手射羽毛箭,攻击力为5");

}

@end

//中级弓箭手

@interface ArchMan :NSObject<ArchProtocol>

@end

@implementation ArchMan

-(void)shoot{

    NSLog(@"普通弓箭手射铁箭,攻击力为8");

}

@end

//高级弓箭手

@interface SuperArchMan :NSObject<ArchProtocol>

@end

@implementation SuperArchMan

-(void)shoot{

    NSLog(@"高级弓箭手射穿甲箭,攻击力为15");

}

@end

    (3)调用这些类

       NSMutableArray *array = [NSMutableArrayarray];       

        SuperArchMan *superMan = [[SuperArchManalloc] init];

        StudentArchMan *srudentMan = [[StudentArchManalloc] init];

        ArchMan *archMan = [[ArchManalloc] init];        

        [array addObject:superMan];

        [array addObject:srudentMan];

        [array addObject:archMan];

        for (NSObject<ArchProtocol> *archManin array) {

            [archMan shoot];

        }


4、基协议

    一个协议可以遵守多个协议,遵守了其他协议,就相当于拥有了其他协议中拥有的方法。OC中除了有一个NSObject类之外,还有一个NSObject协议,任何协议都遵守NSObject协议

    自定义的协议都要求遵守NSObject协议

5、协议什么情况下定义在什么地方

    协议可以单独定义在类的.h文件中,也可以创建一个.h文件定义协议

    如果该协议仅仅用于单独一个类遵守,应该把协议定义在该类中;

    如果协议需要很多类来遵守,就应该单独创建一个.h文件来定义协议。

6、使用协议来定义变量

    如果程序需要使用协议来定义变量,有两种语法:

    NSObject<协议1,协议2...>  *变量名;

    id<协议1,协议2...> 变量名;

    通过上述语法格式定义的变量。它们编译时类型仅仅是所遵守的协议类型,因此只能调用该协议中定义的方法。

7、代理(委托)设计模式

    设计模式(Design Pattern)描述了软件开发过程中若干重复出现的问题的解决方案,目的是提高程序的可扩展性和可维护性。

    代理设计模式(delegate)是指一个对象提供机会给另一个对象中的行为变化做出反应。

8、代理模式的使用(以照顾小孩为例)

    (1)定义一个协议

@protocol BabyProtocol <NSObject>

-(void)drink;

-(void)milk;

-(void)changeNappy;

-(void)play;

@end

    (2)定义一个小孩的类

@interface Baby : NSObject

@property (nonatomic) NSObject<BabyProtocol> *grandma;

//定义宝宝的状态

@property (nonatomic) NSString *state;

-(void)cry;

@end

-(void)cry{

    if ([_state isEqualToString:@"饿了"]) {

        [_grandma milk];

    }

    else if ([_state isEqualToString:@"渴了"]) {

        [_grandma drink];

    }

    else if ([_state isEqualToString:@"拉屎了"]) {

        [_grandma changeNappy];

    }

    else {

        [_grandma play];

    }

}

    (3)定义保姆类    

@interface Grandma : NSObject<BabyProtocol>

@end

-(void)drink{

    NSLog(@"给宝宝喝水");

}

-(void)milk{

    NSLog(@"给宝宝喂奶");

}

-(void)changeNappy{

    NSLog(@"给宝宝换尿布");

}

-(void)play{

    NSLog(@"陪宝宝玩");

}

    (4)使用代理实现照顾孩子的动作

        Baby *baby = [[Baby alloc] init];

        Grandma *grandma = [[Grandma alloc] init];

        baby.grandma = grandma;       

        baby.state = @"饿了";

        [baby cry];

          

  









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值