黑马程序员——OC之protocol

本文详细介绍了Objective-C中的协议概念,包括如何定义协议、遵守协议及实现协议等关键内容。此外,还介绍了协议类型限制和代理设计模式的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

------  Java培训、Android培训、iOS培训、.Net培训期待与您交流! ------

http://www.itheima.com

  • protocol(协议):可以声明一些必须实现的方法和选择实现的方法,一般写到一个.h的头文件中。
  • 协议的作用:供其他的类去遵守,如果一个类遵守了一个协议,就应该实现这个协议中定义的必须要实现的方法。
  • 协议使用流程:协议的定义、遵守协议、实现协议。
  • 协议的定义格式:

@protocol 协议名称 <NSObject>  注意:默认遵守NSObject协议
//方法声明列表
@end;

  • 遵守协议的格式:
创建类的时候遵守某个或者某几个协议:

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

多个协议之间用逗号 , 隔开:

@interface 类名 : 父类 <协议名称1,协议名称2>
@end

某个协议遵守某个或者某几个协议:

@protocol 协议名称<其他协议名称>
@end

多个协议之间用逗号 , 隔开:

@protocol 协议名称 <其他协议名称1, 其他协议名称2>
@end

  • 实现协议:如果一个类遵守了某个协议则只需要在这个类的实现(.m)文件中,实现协议的方法就可以了。
  • protocol使用注意:用来声明方法(不能声明成员变量),不能写实现;只要某个类遵守了这个协议,就拥有了这个协议中的所有方法声明;只要父类遵守了某个协议,那么子类也遵守;protocol声明的方法可以让任何类去实现,protocol就是协议;OC不能继承多个类(单继承)但是能够遵守多个协议;<NSObject>是基协议,是最根本最基本的协议,其中声明了很多最基本的方法;协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一份协议中的方法声明。
  • @required关键字:修饰的方法是必须要实现的。默认情况下是必须要实现的。
  • @optional关键字:修饰的方法是可以实现,也可以不实现。
required关键字、optional关键字应用:

@protocol baseProtocol <NSObject>

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

@required 

-(void)run;

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

@optional

-(void)playgame;

@end

  • protocol类型限制:

1.id类型对象的限制:格式:id <协议名称> 变量名,例如:id<houseHold> obj;表示obj只能赋值遵守了houseHold协议的对象。

2.指定特定类的对象赋值的类型限制:格式:类名<协议名称> *变量名,例如:Girl<houseHold> *obj = girl;表示obj赋值的时候,必须是Girl类的对象,并其遵守了houseHold协议。

3.对象关联关系下,对象的类型限制:例如:女孩需要一条会算术的狗,在Girl的文件声明中使用@property (nonatomic,strong) Dog<caculatorProtocol> *dog;

Dog *d = [Dognew];

Girl *girl = [Girlnew];

girl.dog = d;//如果Dog.h文件中没有遵守caculatorProtocol协议,此条语句处编译器会发出警告。

  • protocol代理设计模式:某个对象指定另一个对象处理某些特定任务的设计模式。下面以保姆喂婴儿吃东西的例子加以说明:
协议部分:
@protocol lookBabyProtocol 
//喂婴儿吃东西
-(void)feedBaby;
@end
让保姆遵守这个协议:
#import 
//保姆想成为婴儿的代理人,就必须遵守lookBabyProtocol协议
#import "lookBabyProtocol.h"
@interface BaoMu : NSObject
@end
让保姆实现协议:
@implementation BaoMu
//喂婴儿吃东西
-(void)feedBaby{
NSLog(@"保姆正在喂婴儿吃东西");
}
@end
婴儿的.h文件中声明吃的行为,并且对保姆的类型加以限制,保证了保姆必须遵守协议
@interface Baby : NSObject
@property (nonatomic,strong) BaoMu *bm;
-(void)wantEat;
@end
婴儿吃东西(通过代理)的行为实现:
@implementation Baby
-(void)wantEat{
    NSLog(@"婴儿在哭...");
    //保姆要喂它吃东西
    [self.bm feedBaby];
}
@end
这样我们就可以创建对象调用方法,通过代理完成婴儿吃东西的行为:
BaoMu *baomu = [BaoMu new];
Baby *baby = [Baby new];
baby.bm = baomu;
[baby wantEat];
  • protocol代理模式应用场合:
1.监听器的场合:对象B想监听对象A的一些行为 (让对象B成为对象A的代理对象);
2.通知的场合:当对象A发生了一些行为,想告知对象B (让对象B成为对象A的代理对象);
3.当对象A无法处理某些行为或不想自己做的时候,想让对象B帮忙处理 (让对象B成为对象A的代理对象)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值