OC基础——Protocal(协议)

本文详细介绍了Objective-C中的Protocols,包括其基本概念、用途、语法以及如何遵守协议。Protocols是一系列方法的列表,定义了其他对象可以实现的接口,常用于实现委托模式和多继承。通过遵守协议,类可以拥有协议中声明的所有方法,而子类会继承父类所遵守的协议。协议的编写涉及@required和@optional关键字,以及如何在类声明中指定遵守的协议。此外,还讲解了如何在定义变量时指定协议以及协议的组织方式。

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



1、协议:1> 是一系列方法的列表,其声明的方法可以被任何类实现。
                2> 协议不是类,它是定义了一个其他对象可以实现的接口。
                3> 如果这个类实现了协议中的某个方法,也就是这个类实现了那个协议。
                4> 委托:就是调用自己定义方法,别的类来实现。
2、基本用途:1> 可以用来声明一大堆方法(不能声明成员变量),不能写实现。

                     2> 只要某个类中遵守了这个协议,就相当于拥有了这个协议中所有的方法声明。
                     3> 只要父类遵守了某个协议,就相当于子类也遵守了。
3、基本语法
1>协议的编写格式:

@protocal  协议名称

     方法声明列表;

@end

eg:
<span style="font-family:Microsoft YaHei;font-size:14px;">@protocal myorotocal <NSObject>//NSObject是基协议,每个协议必须遵守基协议。
//方法的声明
-(void)test1;
-(void)test2;
@end</span>
2> 协议关键词
协议中有2个关键字可以控制方法是否要实现(默认是@required),在大多数情况下,用途在于程序员之间的交流。
@required:要求方法必须实现,不实现就会发出警告(默认
@optional:不要求一定实现。
3> 如何遵守协议
    1)类遵守协议
       @interface 类名:父类名<协议名称1,协议名称2>
       @end
    2)协议遵守协议:一个协议可以遵守其他多个协议,多个协议之间用逗号 , 隔开:
       @protocal 协议名<协议名称1,协议名称2>
  注意:如果一个协议遵守了另外一个协议,就可以拥有另一个协议的所有方法声明。
eg:创建一个协议:
<span style="font-family:Microsoft YaHei;font-size:14px;font-weight: normal;">#import <Foundation/foundation.h>
//MyProtocal协议,这个协议遵守基协议<NSObject>
@protocal MyProtocal <NSObject>
//在协议中声明很多有用的方法;
//@property int age;在协议中不能声明成员变量,只能声明方法,也不能实现方法。
@required
//@required关键字,主要用于程序员之间的交流,要求实现
-(void)ptint;
-(void)haha;
@end</span>
遵守协议:
<span style="font-family:Microsoft YaHei;font-size:14px;font-weight: normal;">#import <Foundation/Foundation.h>
#import<MyProtocal.h>
//在类的声明中加入协议的头文件
//Person类的声明,这个类继承了NSObject类,遵守MyProtocal协议
@interface Person:NSObject<MyProtocal>
@end</span>
完成协议中声明方法的实现:
<span style="font-family:Microsoft YaHei;font-size:14px;font-weight: normal;">#import"Person.h"
@implementation Person
//在这里进行遵守的协议中声明方法的实现
-(viod)print
{
     NSLog(@"____________");
}
-(void)haha
{
    NSLog(@"哈哈");
}
@end</span>
4、基协议
1>NSObject是一个基类,最基本的类,任何其它类型最终都要继承NSObject;
2>NSObject也是一个基协议,一般写协议的时候最后都要加上<NSObject>。
5、 定义变量时指定协议
1>@property (nonatomic,strong)类名 <协议名称> *变量名
eg:NSObject<NSCopying>*obj;// NSObject类型的对象,并且obj要遵守NSCopying协议。
2>@property(nonatomic,strong) id<协议名称>变量名
eg:id<NSCoding> obj2;//任何OC类型的对象,并且要遵守NSCoding协议。
<span style="font-family:Microsoft YaHei;font-size:14px;font-weight: normal;">@property(nonamic ,strong )Car <myprotocal> *c;//c属性遵守了myprotocal协议</span>
@property (nonatomic,strong) id<协议名称> 属性名
在.h文件中,如果某个对象遵循某个协议,那么只需要在.h文件开头 @protocal 协议名,类似于@class的用法,等到在.m文件中正在用到的时候再 #import“协议名”,例如:
在person.h文件中:
<span style="font-family:Microsoft YaHei;font-size:14px;"><span style="font-weight: normal;">#import <Foundation/Foundation.h>
@class hashiqi;
@protical MyProtocal;
@interface Person :NSObject <MyProtocal> 
@property (nonatomic ,strong) hashiqi <Protocol> *dog;
@end</span>
</span>
6、协议本身写在.h文件中,但也可以定义在任何地方,当这个协议只有这个类使用遵守时,一般把协议写在这个类里面,当这个协议需要多些类去实现时,就写在外边单独的文件中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值