Objective-C 委托、非正式协议、正式协议

2024-08-27 05:58

本文主要是介绍Objective-C 委托、非正式协议、正式协议,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Objective-C 委托、非正式协议、正式协议


一、概念:
1、委托(delegate,也叫代理):当一个对象接受到某个事件或者通知的时候,会向它的Delegate对象查询它是否能够响应这个事件或者通知,如果可以,这个对象就会给它的Delegate对象发送一个消息(执行一个方法调用)。在这种机制下,您可以不进行子类化和方法重载,而是将自己的定制代码放到委托对象中,从而避免对复杂对象进行修改。当您感兴趣的事件发生时,复杂对象会将消息发送给您定制的委托对象。您可以通过这种“挂钩”执行自己的定制代码,实现需要的行为。
2、非正式协议(informal protocol):使用类别category来实现,非正式协议是NSObject的一个类别,这样任何类的对象都可以作为委托对象来使用,它可以列出对象能够执行的所有方法,这样用来实现委托, 我们可以使用选择器来判断该非正式协议中是否有这个方法。
3、正式协议(formal protocol):是一个命名的方法列表,与非正式协议相比不同的是,它要求显示的采用协议,采用协议的方法是在类的@interface声明中列出协议的名称,此时,实现协议的类应该遵守协议,承诺实现协议中的所有方法,否则编译器将会发出警告。
正式协议协议类似于C++的纯虚函数,协议只有声明,没有实现,用来在子类中实现,协议中的方法有两类属性,@required(默认)和@optional两种,@required属性的要求实现协议的类必须要实现这种方法,而@optional属性的方法则不要求,如果不确定协议是否被实现,可以使用respondsToSelector:@select()来判断。

二、应用举例

源码如下: 

/*********简单的委托举例************/

@interface A :NSObject

-(void)Log;

@end

@implementation A

-(void)Log{

    NSLog(@"This is A Log");

}

@end


@interface B :NSObject{

   A* delegate;

}

@property (nonatomic,retain)A* delegate;

-(void)callLog;

@end

@implementation B

@synthesize delegate;

-(id)init{

   if (self = [superinit] ) {

        delegate = [[Aalloc]init];

    }

    returnself;

}

-(void)callLog{

    

    NSLog(@"This is B callLog");

    [self.delegateLog];

}

@end

/*********简单的委托举例************/


/*********简单的正式协议举例************/

//协议--begain

@protocol myProtocol

//可选实现的

@optional

-(void)optional_print;

//要求实现的

@required

-(void)required_print;

@end

//协议--end


//使用协议的类--begain

@interface  myClass :NSObject<myProtocol>

-(void)print;

@end

@implementation myClass

-(void)print{

    NSLog(@"This is myClass print");

}

//实现可选实现的协议

-(void)optional_print{

    NSLog(@"This is protocol optional_print");

}

//实现必须实现的协议

-(void)required_print{

    NSLog(@"This is protocol required_print");

}

@end

//使用协议的类--end

/*********简单的正式协议举例************/



/*********简单的非正式协议举例************/

@interface NSObject(myCategory)

-(void)informal_protocol_print;

@end

@implementation NSObject(myCategory)

-(void)informal_protocol_print{

    NSLog(@"This is informal_protocol_print");

}

@end

/*********简单的非正式协议举例************/



/*********正式协议实现委托举例************/

//协议--begain

@protocol myProtocolEx

//可选实现的

@optional

-(void)optional_print;

//要求实现的

@required

-(void)required_print;

@end

//协议--end


@interface myClassEx :NSObject{

   id<myProtocolEx> delegate;

}

@property (nonatomic,assign)id<myProtocolEx> delegate;

-(void)print;

@end

@implementation myClassEx

@synthesize delegate;

-(void)print{

    NSLog(@"This is myClassEx print");

    [self.delegateoptional_print];

    [self.delegaterequired_print];

}

@end


@interface myCall :NSObject<myProtocol>{

   myClassEx *cls;

}

@property (nonatomic,retain)myClassEx *cls;

-(void)callPrint;

@end

@implementation myCall

@synthesize cls;

-(id)init{

   if (self=[superinit]) {

        myClassEx* c = [[myClassExalloc]init];

       self.cls = c;

       cls.delegate = (id)self;

        [crelease];

    }

    returnself;

}

-(void)callPrint{

    NSLog(@"This is myCall callPrint");

    [self.clsprint];

}

-(void)optional_print{

    NSLog(@"This is myCall implemented formal protocol optional_print");

}

-(void)required_print{

    NSLog(@"This is myCall implemented formal protocol required_print");

}


@end

/*********正式协议实现委托举例************/


int main(int argc,char *argv[])

{

    @autoreleasepool {

        

       //委托的使用

       B* b = [[B alloc]init];

        [bcallLog];

        

        [b informal_protocol_print];//非正式协议的使用

        NSLog(@"---------------------------------");

        

       //协议的使用

        myClass *cls = [[myClassalloc]init];

        [clsprint];

        [clsoptional_print];

        [clsrequired_print];

        

        [cls informal_protocol_print];//非正式协议的使用

        NSLog(@"---------------------------------");

        

       //正式协议实现委托的使用

       myCall *call = [[myCallalloc]init];

        [callcallPrint];

        NSLog(@"---------------------------------");

        

       return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

    }

}



 

这篇关于Objective-C 委托、非正式协议、正式协议的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110828

相关文章

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

Java对接MQTT协议的完整实现示例代码

《Java对接MQTT协议的完整实现示例代码》MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛,:本文主要介绍Ja... 目录前言前置依赖1. MQTT配置类代码解析1.1 MQTT客户端工厂1.2 MQTT消息订阅适配器1.

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

C++11委托构造函数和继承构造函数的实现

《C++11委托构造函数和继承构造函数的实现》C++引入了委托构造函数和继承构造函数这两个重要的特性,本文主要介绍了C++11委托构造函数和继承构造函数的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、委托构造函数1.1 委托构造函数的定义与作用1.2 委托构造函数的语法1.3 委托构造函

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

C#基础之委托详解(Delegate)

《C#基础之委托详解(Delegate)》:本文主要介绍C#基础之委托(Delegate),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 委托定义2. 委托实例化3. 多播委托(Multicast Delegates)4. 委托的用途事件处理回调函数LINQ