OC中协议的讲解

OC中的协议:一组方法声明的列表,协议中不需要实现这些方法,谁遵守这个协议,谁就需要实现协议中的方法。协议创建的步骤:

  1. 制定协议内容(方法声明列表)
  2. 遵守协议(.h)
  3. 实现协议中方法(.m)
  4. 调用协议中的方法

在OC中完整的创建一个协议:

一、例子:有一个漂亮的妹子要征婚,对另一半的要求:

  • 会写代码

妹子对另一半的要求实际上就是协议。

  • 制定协议的一方:妹子
  • 遵守协议的一方:想和妹子结婚的男人
  • 协议的内容:(也即要求)
    • 1、高
    • 2、富
    • 3、帅
    • 4、会写代码

二、以上面女方相亲为例创建一个协议
分析:OC中的协议一定会有创建和遵守!
协议的创建和遵守:
1. 创建协议:协议中声明相关的方法 ———> 女方对另一半提出的要求。
2. 遵守协议:实现协议中的相关方法 ———> 男方需要达到女方的相关要求。

  1. 制定协议,创建一个 ProtocolToMan.h文件
#import <Foundation/Foundation.h>

//  说明:
//  @protocol: 声明协议的关键字
//  ProtocolToMan: 协议名
//  <NSObject>: 基协议,OC中所有的协议都遵守这个基协议

@protocol ProtocolToMan <NSObject> //声明的一个协议,协议名为ProtocolToMan,协议遵守基协议

// 协议的内容就是要求 

@required
- (void)height; // 高

@required
- (void)money; // 富

@required
- (void)smart; // 帅

@optional 
- (void)writeCode; // 会写代码

@end
  1. Man类
// Man.h

#import <Foundation/Foundation.h>

#import "ProtocolToMan.h" // .h:遵守协议

@interface Man : NSObject <ProtocolToMan> // 类声明的后面<协议名>表示该类遵守这个协议

@end
// Man.m

#import "Man.h"

@implementation Man

// .m:实现协议中的方法

// 实现协议中的方法,达到要求
- (void)height {
   NSLog(@"I am so height..............");
}

- (void)money {
   NSLog(@"I have so much money........");
}

- (void)smart {
   NSLog(@"I am so smart...............");
}

- (void)writeCode {
   NSLog(@"write hello world...........");
}

@end
  1. 协议的使用
Man *qianfu = [[Man alloc] init]; // 实例化一个man对象

// 思考:来了一个高富帅来征婚,但是这个高富帅偏偏不会写代码,骗这个妹子他什么都会,
// 妹子很单纯,相信了。妹子有一天心血来潮,让这个高富帅写一个hello world程序,
// 高富帅瞬间露馅了,代码瞬间崩溃了,高富帅崩溃,妹子也崩溃了,妹子很伤心,
// 妹子做了一个决定了:当再有人征婚,先进行判断,判断男人是否真的满足要求。

    // 调用协议中方法
//    [qianfu height];
//    [qianfu money];
//    [qianfu smart];
//    [qianfu writeCode];
    if ([qianfu respondsToSelector:@selector(height)]) {
        [qianfu height];
    }
    if ([qianfu respondsToSelector:@selector(money)]) {
        [qianfu money];
    }
    if ([qianfu respondsToSelector:@selector(smart)]) {
        [qianfu smart];
    }
    if ([qianfu respondsToSelector:@selector(writeCode)]) {
        [qianfu writeCode];
    }
  1. 声明协议时的关键字
    再思考: 想遵守协议,必须要能够满足所有要求,实现所有方法,但是现实很残酷,女方的要求虽然提出来了,但是目前为止没有一个男的达到要求。一年过去了,两年过去了,三年过去了…,女孩他妈着急了,和女孩商量了一下,对白如下:

    母亲:娃,要不咱们把要求降一降吧,眼瞅着你这干提要求也嫁不出去,家里粮食也快不够吃了!

    娃:好吧,那么高富帅必须一定要达到要求,至于会不会写代码,那就算了,能写最好,不能写就算了!

    那么这时候就可以在协议中声明方法时加上相应的关键字即可。声明协议方法时的关键字:
    @required:表示必须实现的方法,默认;
    @optional:表示可以实现,也可以不实现的方法;

    尝试将Man.m@implementation里的 height方法相关内容注释掉,Xcode会产生:Method ‘height’in protocol not implemented警告,即 height方法没有实现。

    如果将heightmoneysmartwriteCode方法都注释掉,会产生三条警告。因此,如果我们在协议声明里什么都不写默认是required,也就是必须要实现的。
<think>嗯,用户现在想了解除了OC门之外的其他类型门电路,要求分别讲解。结合之前的讨论历史,用户已经对OC门有了深入理解,现在需要扩展知识面到其他特殊门电路类型。 用户提供的引用资料很有帮助,其中提到OD门、三态门,还隐含了推挽输出结构。需要系统性地梳理这些门电路的区别和特点。从引用[1][2][5]看,OD门是MOS版本的OC门,三态门则是另一种关键结构。引用[3][4]强调了这些门在芯片IO设计中的重要性。 考虑设计这样的讲解结构:先分类说明(OD门、三态门、推挽输出),每个类别从原理图符号、工作原理、核心特点到典型应用展开。特别注意要突出它们与普通门电路的区别,比如OD门的高阻态特性,三态门的使能控制机制。 对于OD门,准备强调它与OC门的工艺差异(MOSvs BJT)但功能相似性,引用[5]提到“用法基本一致”这点很重要。三态门部分则要重点说明使能端的作用,引用[1]提到的“总线隔离”功能是核心价值。推挽输出作为对比项,需要解释其驱动能力优势但缺乏“线与”功能的特性。 在应用场景方面,考虑结合具体总线协议:OD门用于I2C(引用[2]),三态门用于CPU地址总线(引用[1]),推挽输出用于GPIO驱动。技术细节上要包含上拉电阻计算(引用[5]的公式)、高阻态电压范围等关键参数。 最后设计相关问题时要延续用户的学习路径:比较性问题(如OD与三态门区别)、设计问题(如总线冲突解决)、延伸问题(如CMOS工艺影响)。这些问题既能巩固当前知识,又能自然引导到后续学习点。</think>除了OC门(集电极开路门),数字电路中还有多种特殊结构的门电路,它们在总线控制、电平转换和驱动能力等方面有独特优势。以下基于引用资料详细解析其他关键门电路类型: --- ### 一、OD门(漏极开路门) **原理与结构** OD门是OC门的MOS工艺版本,其输出级仅包含**NMOS管且漏极开路**(见图1)[^2][^5]。 - **输出状态**: - 输入低电平时:NMOS导通 → 输出低电平($V_{OL} \approx 0V$) - 输入高电平时:NMOS截止 → 输出**高阻态**(需外接上拉电阻$R_p$才能输出高电平)[^3][^5]。 - **逻辑功能**: 多个OD门并联可实现**线与逻辑**(Wired-AND): $$Y = (A \cdot B \cdot \cdots)_{\text{逻辑与}}$$ 仅当所有门输出高阻态时,总线才被$R_p$上拉至高电平[^2]。 **应用场景** 1. **I2C/SMBus总线**:多设备共享数据线,避免冲突[^2] 2. **电平转换**:外接$R_p$到高压$V_{DD2}$,实现3.3V→5V信号转换[^5] 3. **驱动LED/继电器**:直接控制大电流负载[^5] > 📌 **OC门与OD门核心区别** > | 特性 | OC门(BJT工艺) | OD门(MOS工艺) | > |------------|----------------------|----------------------| > | 工艺基础 | 双极型晶体管 | 场效应管(NMOS) | > | 驱动能力 | 中等(受限于$I_C$) | 较低(MOS管导通电阻)| > | 开关速度 | 较快 | 较慢(因寄生电容) | > | 功耗 | 较高 | 较低[^5] | --- ### 二、三态门(Tri-State Gate) **原理与结构** 在标准门电路基础上增加**使能端(EN)**,实现三种输出状态[^1]: - **使能有效(EN=1)**:按输入信号正常输出高/低电平 - **使能无效(EN=0)**:输出**高阻态**(等效断开)[^1][^4] **核心功能** $$Y = \begin{cases} A \cdot B & \text{(EN=1时)} \\ \text{高阻态} & \text{(EN=0时)} \end{cases}$$ **应用场景** 1. **总线分时复用**: CPU通过三态门控制多设备共享地址/数据总线(图2)。同一时刻仅一个设备使能[^1][^4]。 ```plaintext +---------+ +------------+ | CPU |-----| 三态门 EN1 |---设备1 | | +------------+ | 总线 |-----| 三态门 EN2 |---设备2 +---------+ +------------+ ``` 2. **双向数据传输**: 如USB接口,通过方向控制切换输入/输出状态[^4]。 > ⚠️ **关键设计规则** > 同一总线上多个三态门禁止同时使能,否则导致**短路电流**损坏电路[^1]! --- ### 三、推挽输出(Push-Pull) **原理与结构** 由**互补的PMOS和NMOS管**构成(或BJT的PNP-NPN对)[^5]: - 输入高电平:PMOS截止,NMOS导通 → 输出低电平 - 输入低电平:PMOS导通,NMOS截止 → 输出高电平 - **无高阻态**,输出阻抗低,驱动能力强[^5]。 **优缺点对比** | 特性 | 推挽输出 | OC/OD门 | |---------------|---------------|------------------| | 输出状态 | 高/低电平 | 低电平/高阻态 | | 驱动能力 | ★★★★☆ | ★★☆☆☆(需外接$R_p$)| | 开关速度 | 快(无$R_p$延迟)| 慢 | | 线与功能 | 不支持 | 支持 | **应用场景** - 高速数字信号传输(如DDR内存) - GPIO直接驱动小电流负载 - 无需总线共享的场合[^5] --- ### 四、其他门电路补充 1. **传输门(Transmission Gate)** - 由并联的PMOS和NMOS构成,实现**双向模拟开关** - 用于模拟信号切换、数据选择器[^4] 2. **施密特触发器(Schmitt Trigger)** - 带**滞回特性**的门电路,抗噪声能力强 - 应用:信号整形、按键消抖[^1] --- ### 总结:门电路选型指南 | 场景 | 推荐门电路 | 原因 | |---------------------|----------------|--------------------------| | 多设备总线共享 | 三态门/OD门 | 避免冲突,支持高阻态隔离 | | 电平转换 | OD门 | 外接$R_p$灵活适配电压 | | 高速数字信号 | 推挽输出 | 低延迟,强驱动能力 | | 驱动大电流负载 | OC门(BJT工艺)| 耐流能力强 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值