protocol(協議)

本文详细介绍了Objective-C中的Protocol概念和使用,包括基本使用流程、协议的其他用法、@required和@optional的含义、协议类型限制以及在代理设计模式中的应用,并提供了代码实例。

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

protocol的概念及基本使用

1.protocol的概念
在写java的时候都会有藉口interface这个概念,接口就是一堆方法的声明没有实现,而在OC裡面,interface是一个类的头文件声明,并不是真正意义上的藉口的意思,在OC中,接口是由一个叫做协议的protocol来实现的。
这个protocol裡面可以声明一些方法,和java不同的是,它可以声明一些必须实现的方法和选择实现的方法。这个和java是完全不同的。

2.protocol的使用流程

//1.定义协议
@protocol 协议名称 <NSObject> //默认遵守NSObject协议
//方法声明列表
@end;
//注意:协议默认的要采纳NSObject的协议

//2.采纳协议
//2.1类遵守协议
创建类的时候遵守某个或者某几个协议
```objective-c
@interface 类名 : 父类 <协议名称>
@end

@interface 类名 : 父类 <协议名称1, 协议名称2>
@end
//2.2某个协议也可以遵守某个或者某些协议,一个协议可以遵守其他多个协议
@protocol 协议名称 <其他协议名称>
@end

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




<div class="se-preview-section-delimiter"></div>

//3、实现协议中的方法


**3.protocol的基本使用**

1.定义协议




<div class="se-preview-section-delimiter"></div>

```objective-c
Run.h

#import <Foundation/Foundation.h>
@protocol Run<NSObject>
-(void)eat;
-(void)run;
@end

Wrok.h

2.采纳协议

#import <Foundation/Foundation.h>
@protocol Work<NSObject>
-(void)myWork;
@end

Person.h

#import "Run.h"
#import "Work.h"
@interface Person : NSObject<Run, Work>
@end

3.实现协议中的方法
如果一个类遵守了某个协议,则只需要在这个类的实现(.m)文件中,实现协议的方法既可以了

Person.m

#import"Person.h"
@implementation Person
-(void)run{
    NSLog(@"人会跑");
}

-(void)eat{
    NSLog(@"人开始吃东西");
}

-(void)myWork{
    NSLog(@"人要工作");
}

@end

协议的使用

main.m

#import<Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]){
    @autoreleasepool{
        Person * p = [Person new];
        [p myWork];
        [p eat];
        [p run];
    }
    return 0;
}
4.使用图形界面创建协议
选择文件时找到 OS X 下的 Source,选择 Objective-C File->Next,在 File Type中选择Protocol->Next->Creat;

协议的其他用法

protocol的使用注意:
1、protocol:就一个用途,用来声明一大堆的方法(不能声明成员变量),不能写实现

2、只要某个类遵守了这个协议,就拥有了连这个协议中的所有方法声明。

3、只要父类遵守了某个协议,那么子类也遵守。

4、protocol声明的方法可以让任何类去实现,protocol就是协议。

5、OC不能继承多个类(单继承)但是能够遵守多个协议。继承(:),遵守协议 (<>).

6、基协议: NSObject就是基协议,是最根本最基本的协议,其中声明了很多基本的方法。

7、协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一个协议中的方法声明

2.protocol基协议介绍
NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它,它还有名字也叫NSObject的协议,它是一个基协议,最根本最基本的协议,每个新的协议都要遵守NSObject协议

protocol中@required和@optional

@required和@optional是协议方法声明中的两个关键字
他们主要用于控制方法是否要实现(默认是@required),在大多数情况下,用途在与程序员之间的交流。

@protocol RunProtocol <NSObject>
@required //从这里到@option之间都是必须实现的方法
-(void)run;

@optional //下面的都是可以选择实现的方法
-(void)eat;
@end

protocol类型限制

类型限制,就是说,如果给一个遵守了某个协议A的变量a赋值对象b,那么对象b也必须遵守协议A。否则不能赋值。

//假设有一个Person类,和一个myPro协议
id gF= [[Person alloc] init]; //这样不会报错,因为任何对象都可以赋值给id类型的对象。



//如果Person该类没有遵守myPro协议,那么下面的写法则是错误的,如果遵守,则正确。
id<myPro>gF = [[Person alloc] init];

//在Person没有遵守myPro协议时,Student类遵守了,那么下面的写法是可以的
Person<myPro> p = [Student new];
id和instancetype的区别
1)instancetype只能作为函数或者方法的返回值
2)id能作为方法或者函数的返回值、参数类型,也能用来定义变量
3)instancetype对比id的好处:能精确的限制返回值的具体类型

protocol代理设计模式

代理模式概念:
传入对象,代替当前类完成了某个功能,称为代理模式
利用协议实现代理模式的主要思路为:
1)定义一个协议,里面声明代理类需要实现的方法列表,比如这里一个代理类需要实现feedBaby与HongSleep方法
2)创建一个代理类(比如BaoMu),遵守上面的代理协议
3)在需要代理的类中(Baby),定义一个对象类型为id且遵守代理协议的成员变量
4)在Baby类中调用成员变量_delegate(代理)的方法,调用代理类的方法
5)main.m或其他使用Baby类的文件中,为Baby类的成员变量赋值
protocol代理模式应用场合
1.当对象A发生了一些行为,想告知对象B(让对象B成为对象A的代理对象)
2.当对象B想监听对象A的一些行为(让对象B成为对象A的代理对象)
3.当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象)

代理模式设计代码实例

main.m

#import <Foundation/Foundation.h>
#import "Student.h"
#import "LinkHome.h"

int main(int argc, const char * argv[]){
    @autoreleasepool{
        Student * stu = [Student new];

        LinkHome * linkHome = [LinkHome new];
        stu.delegate = linkHome;
    }
    return 0;
}

/*
    代理类:linkHome
    代理对象: delegate
    协议 findHouseProtocol
    协议内容:findHouse
*/
Student.h

#import "Foundation/Foundation.h"
#import "findHouseProtocol.h"
@interface Student : NSObject
-(void)needHouse;

@property(nonaotmic, strong) id <findHouseProtocol> delegate;

@end
Student.m

#import "Student.h"
@implementation Student
    NSLog(@"学生需要一个温暖的家");
    [self.delegate findHouse];
@end
LinkHome.h

#import <Foundation/Foundation.h>
#import "findHouseProtocol.h"

@interface LinkHome : NSObject <findHouseProtocol>

@end
LinkHome.m

#import "LinkHome.h"
@implementation LinkHome
-(void)findHouse{
    NSLog(@"恋家正在帮学生找房子");
}
@end
findHouseProtocol.h

#import <Foundation/Foundation.h>
@protocol findHouseProtocol <NSObject>
-(void)findHouse;
@end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值