OC视频笔记5.4(协议的定义与使用)(代理设计模式)(代理设计模式思想)

微信小程序真机HTTPS证书链失效排查与修复指南 HTTPS证书信任链是保障Web通信安全的基础机制,其核心在于客户端能否通过服务器提供的证书及其上级签发者,逐级回溯至自身预置的可信根证书。在微信小程序场景中,由于客户端不复用系统根证书库,而是采用固化、精简且更新滞后的自研CA白名单,导致大量符合浏览器标准的证书(如Let’s Encrypt新版ISRG Root X1、TrustAsia等)在真机环境下触发net::ERR_CERT_AUTHORITY_INVALID错误。该问题本质是证书链断裂或签名算法/密钥长度不合规,而非域名配置或CORS策略异常。 阅读详情

参考:姜维的技术人生的csdn博文     

http://blog.youkuaiyun.com/column/details/ios-enhance.html

参考了他的协议和代理两篇博文。


协议:

这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到。协议是定义了一组方法,让其他的类实现,协议本身不是类,但是与类相同的是协议的名字也是以大写字母开头。(OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习Java中的接口时候,看可以知道其实接口就相当于一种契约(协议),给他的实现类打上标记了,当然这个活在Java5.0之后,被注解替代了,因为注解就是为了此功能诞生的。

协议就是定义了一组方法,然后让其他类去实现)。

@required表示必须实现的方法

@optional表示可选实现的方法

(如果不标注就表示默认,默认是必须实现的)

协议的定义格式:

@protocol  协议名  <父协议>

定义方法

@end


注:定义协议的关键字是@protocol,同时协议也是可以继承父协议的

<NSObject>是WxhlProtocol的父协议,它本身不是类,是协议,只是与NSObject类同名。他也是OC中第一个协议


类实现协议的表示方法:

@interface 类:NSObject<协议>

然后方法实现:

@required必须实现

@optional选择实现

在类的.h文件写上这句话:@interface 类:NSObject<协议名>就可以了,不需要将协议声明的方法挪到类的.h文件里面,然后直接在.m文件里面直接实现就可以了。如果直接将协议定义到类的.h文件里面的话就直接引用该类的.h文件就可以了。(定义在.h文件里面的方法是在 #import <Foundation/Foundation.h>下面直接@protocol  代码@end就可以了)


小技巧:

1.在实现的时候可以用#pragma mark - WxhlProtocol方法将类划分。这样就可以将一个类中的方法类别分的更细,我们可以在文件导航栏中进行查看。

2.#warning 代码过几天在补充,标记处代码会有一个警告,Xcode会在此处显示黄色标记,这个作用就是给自己添加一个标记,后续在来查看。

总结

协议在OC中也是一个很重要的概念,Foundation框架中很多地方都用到了协议,其实和Java中的抽象类以及接口非常相似









代理设计模式:

什么是设计模式?设计模式(Design Pattern)描述了软件开发过程中,若干重复出现的问题得解决方案,目的是提高程序的可扩展性和维护性。


这里举一个简单的例子:

小孩类,护士类,保姆类,其中小孩类有两个方法:wash和play

这里代理对象就是:护士类、保姆类,小孩类是被代理对象。

看一下代码:

首先看一下小孩类:

Children.h

  1. //  
  2. //  Children.h  
  3. //  12_DesignStyle  
  4. //  
  5. //  Created by jiangwei on 14-10-11.  
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
  7. //  
  8.   
  9. #import <Foundation/Foundation.h>  
  10.   
  11. @class Children;//如果没有这行代码的话,协议ChildrenDelegate中得Children类型就会查找不到,报错  
  12.   
  13. @protocol ChildrenDelegate <NSObject>  
  14.   
  15. @required  
  16. - (void)wash:(Children *)children;  
  17. - (void)play:(Children *)children;  
  18.   
  19. @end  
  20.   
  21. @interface Children : NSObject{  
  22.       
  23.     //Nure *_nure;//保姆  
  24.     //这里可以使用多态技术实现,因为保姆,护士有共同的父类NSObject,但是这里不使用这种方式,而是使用id类型  
  25.     //但是我们还需要为这个类型添加一些方法,这里就用到了协议  
  26.     //这个代理对象必须遵从ChildrenDelegate协议  
  27.     id<ChildrenDelegate> _delegate;//这个变量就是小孩的代理对象  
  28.     NSInteger timeValue;  
  29. }  
  30.   
  31. -(void)setDelegate:(id)delegate;  
  32.   
  33. @end  
这里,我们定义了一个协议:ChildrenDelegate,他有两个必要的方法:wash和play

我们还定义了一个很重要的属性

_delegate

这个属性定义有点不一样,这个就是实现代理对象的精髓所在了,id是不确定类型,所以这个_delegate变量可以被赋值为的类型是:

只要实现了ChildrenDelegate协议的类就可以了。这里就记住了,以后这种定义方法后面会用到很多。相当于Java中的接口类型,只能赋值其实现类的类型。只是这里的定义格式为:id<协议名>

然后就是一个设置协议的方法了,注意参数类型也必须是id的

其实这里面也牵涉到了之前说到的多态特性,所以说代理模式也是建立在多态的特性上的。


Children.m

  1. //  
  2. //  Children.m  
  3. //  12_DesignStyle  
  4. //  
  5. //  Created by jiangwei on 14-10-11.  
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
  7. //  
  8.   
  9. #import "Children.h"  
  10.   
  11. //这里用到了保姆的一些动作  
  12. //假如现在想请一个护士,那么我们又要去从新去请一个护士,那么这里面代码需要改,把保姆的地方换成护士的地方  
  13. //产生的原因就是因为耦合度太高了,保姆和孩子耦合在一起,如果需要换的话,就需要改动代码  
  14. //  
  15. @implementation Children  
  16.   
  17. - (id)init{  
  18.     self = [super init];  
  19.     if(self != nil){  
  20.         [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];  
  21.     }  
  22.     return self;  
  23. }  
  24.   
  25. -(void)setDelegate:(id)delegate{  
  26.     _delegate = delegate;  
  27. }  
  28.   
  29. - (void)timerAction:(NSTimer *)timer{  
  30.     timeValue++;  
  31.     if(timeValue == 5){  
  32.         [_delegate wash:self];  
  33.     }  
  34.     if(timeValue == 10){  
  35.         [_delegate play:self];  
  36.     }  
  37. }  
  38.   
  39. @end  
我们自定义了一个初始化方法,在初始化方法中我们做了一个定时器的工作。

  1. [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];  
这个就是OC中启动一个简单的计时器:每隔1s中就去执行一次self中的timerAction方法。

OC中的定时器和java不一样,他的执行逻辑可以单独的在一个指定的方法中去做(C中的函数指针差不多,只要传递一个函数指针过来,就可以执行指定的函数,所以@selector做的工作就是这个),但是Java中必须实现Runable接口,在run方法中执行指定的逻辑代码。

在timerAction方法中,我们是判断当时间到5s了,就执行代理对象的wash方法,10s的时候执行play方法。


在来看一下护士类:

Nure.h

  1. //  
  2. //  Nure.h  
  3. //  12_DesignStyle  
  4. //  
  5. //  Created by jiangwei on 14-10-11.  
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
  7. //  
  8.   
  9. #import <Foundation/Foundation.h>  
  10.   
  11. #import "Children.h"  
  12.   
  13. @interface Nure : NSObject<ChildrenDelegate>  
  14.   
  15. - (void)wash:(Children *)children;  
  16. - (void)play:(Children *)children;  
  17.   
  18. @end  
护士类很简单,实现ChildrenDelegate协议


Nure.m

  1. //  
  2. //  Nure.m  
  3. //  12_DesignStyle  
  4. //  
  5. //  Created by jiangwei on 14-10-11.  
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
  7. //  
  8.   
  9. #import "Nure.h"  
  10.   
  11. #import "Children.h"  
  12.   
  13. @implementation Nure  
  14.   
  15. - (void)wash:(Children *)children{  
  16.     NSLog(@"小孩脏了,保姆帮小孩洗澡");  
  17. }  
  18.   
  19. - (void)play:(Children *)children{  
  20.     NSLog(@"小孩哭了,保姆和小孩玩耍");  
  21. }  
  22.   
  23. @end  
在这里就去实现wash和play方法了


在来看一下保姆类:

Nanny.h

  1. //  
  2. //  Nanny.h  
  3. //  12_DesignStyle  
  4. //  
  5. //  Created by jiangwei on 14-10-11.  
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
  7. //  
  8.   
  9. #import <Foundation/Foundation.h>  
  10.   
  11. #import "Children.h"  
  12.   
  13. @interface Nanny : NSObject<ChildrenDelegate>  
  14.   
  15. - (void)wash:(Children *)children;  
  16. - (void)play:(Children *)children;  
  17.   
  18. @end  

Nanny.m

  1. //  
  2. //  Nanny.m  
  3. //  12_DesignStyle  
  4. //  
  5. //  Created by jiangwei on 14-10-11.  
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
  7. //  
  8.   
  9. #import "Nanny.h"  
  10.   
  11. #import "Children.h"  
  12.   
  13. @implementation Nanny  
  14.   
  15. - (void)wash:(Children *)children{  
  16.     NSLog(@"小孩脏了,护士帮小孩洗澡");  
  17. }  
  18.   
  19. - (void)play:(Children *)children{  
  20.     NSLog(@"小孩哭了,护士和小孩玩耍");  
  21. }  
  22.   
  23. @end  
保姆类和护士类的代码逻辑是一样的,因为他们两个都是实现了一个协议


测试类

main.m

  1. //  
  2. //  main.m  
  3. //  12_DesignStyle  
  4. //  
  5. //  Created by jiangwei on 14-10-11.  
  6. //  Copyright (c) 2014年 jiangwei. All rights reserved.  
  7. //  
  8.   
  9. #import <Foundation/Foundation.h>  
  10.   
  11. #import "Children.h"  
  12. #import "Nure.h"  
  13. #import "Nanny.h"  
  14.   
  15. //核心:id类型+协议  
  16. //做到低耦合操作  
  17. //同时也可以做到两个类之间的通信  
  18.   
  19. int main(int argc, const charchar * argv[]) {  
  20.     @autoreleasepool {  
  21.         Children *child = [[Children alloc] init];  
  22.           
  23.         Nure *nure = [[Nure alloc] init];  
  24.         Nanny *nanny= [[Nanny alloc] init];  
  25.           
  26.         [child setDelegate:nanny];  
  27. //      [child setNure:nure];  
  28.           
  29.         [[NSRunLoop currentRunLoop] run];  
  30.     }  
  31.     return 0;  
  32. }  
看到了,测试类很简单。我们也发现了,代理模式的好处也是显现出来了,比如现在又来了一个人来照顾孩子:妈妈类,那么我们只要让妈妈类实现那个协议即可。这种耦合度也不会很高。所以代理模式还是超级有用的,而且我们后面在开发IOS的时候,会发现他里面用到的代理模式很多的。


运行结果:




总结

这一篇就介绍了OC中如何实现代理模式,其实OC中的代理模式核心技术是:id类型+协议+多态



代理协议的思想:

代理的概念:
当某个类的功能交个其他类去实现。那个实现的类就是代理。

代理模式使用场合:
1.用来解耦合。当一个类的功能需要其他类来实现,又不确定是由哪个类来实现,可以使用代理设计模式。

代理设计模式的实现:
1.定义成员变量为万能指针,并且该对象必须是继承某个协议。

总而言之,代理设计默认的基本思想----两个对象协同解决问题,通常运用于对象间通信。

代理设计模式的基本特点

 

  1. 简化了对象的行为,最大化减小对象之间的耦合度
  2. 使用代理,一般来说无需子类化
  3. 简化了我们应用程序的开发,既容易实现,而且灵活


YOLOv8改进 | 主干篇 | 利用MobileNetV1替换Backbone(轻量化网络结构) 本文给大家带来的改进机制是MobileNetV1,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。这些模型基于简化的架构,并利用深度可分离卷积构建轻量级深度神经网络,其引入了两个简单的全局超参数,用于在延迟和准确性之间进行有效的权衡。实验表明,MobileNets在资源和准确性的权衡方面表现出色,并在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中展现了其有效性,这个模型非常适合轻量化的读者来使用。适用检测目标:轻量化网络结构适合轻量化的读者。 阅读详情

相关推荐

利用Virtuoso IC 618进行LDO稳定性分析与补偿设计

本文详细介绍了如何利用Virtuoso IC 618进行LDO稳定性分析与补偿设计。通过搭建仿真环境、运行STB分析诊断环路问题,并深入探讨密勒补偿、调零电阻等关键技术,帮助工程师在Virtuoso平台中高效完成LDO的稳定性优化与验证,确保芯片在各种工艺角下的鲁棒性。

weixin_29170327的博客 162

【Objective-C】类别(拓展类)、协议

一、类别简介  OC中类别功能强大,它能够在不使用继承的情况下向现有的类添加新的方法。特别是在没有类的源代码的情况下,通过使用类别依然能够向该类添加新的方法。  类别的主要有两个作用,一是向类添加新的方法以拓展类的功能,二时将类的实现部分分布发哦多个文件中。 二、声明类别并实现类别方法 1. 类别的声明与实现的格式如下 #import "目标类名.h" @interface 目标类名

北往风吹 1111

STM32CubeIDE串口打印浮点数踩坑实录:5分钟搞定printf输出小数(附完整配置截图)

本文针对STM32CubeIDE中串口无法打印浮点数的常见问题,提供了详细的解决方案。核心在于通过添加“-u _printf_float”链接器参数,启用标准库的浮点数格式化支持。文章附有完整的配置截图和步骤,并提供了系统性的排查清单,帮助开发者快速解决printf输出小数的问题。

weixin_29163797的博客 343

5.4 iOS开发视频教程—OC中代理设计模式

核心内容: OC中代理的设计模式。 5.4 【无限互联】iOS开发视频教程—OC中代理设计模式:http://www.tudou.com/programs/view/QzPDKxKhdR4/ 百度云网盘视频下载地址:http://pan.baidu.com/share/link?shareid=74971&uk=1711799154

无限互联@彪哥 4085

揭秘 | 顶刊论文插图中的高级配色方案(附RGB/HEX码解析)

本文揭秘了顶级期刊如《Nature》《Science》插图的高级配色方案,详细解析了RGB/HEX码的应用技巧。从双色配色的黄金组合到复杂数据可视化的多色解决方案,提供了实用的配色法则和跨平台一致性建议,帮助科研人员提升图表专业度和视觉传达效果。

weixin_28523493的博客 985

HTTPDebugger实战:iTunes登录协议抓包与签名验证全解析

HTTPS抓包是分析客户端与服务端交互的重要手段,其原理是通过中间人证书解密TLS流量,从而观察请求与响应细节。在调试iTunes登录协议时,抓包能帮助我们定位签名验证失败、x-timestamp过期等棘手问题。然而,许多教程中常见的mumu模拟器抓包、fiddler手机抓包或charles抓包unknown问题,往往让新手陷入工具陷阱。本文以HTTPDebugger为切入点,从TLS握手到认证请求,系统拆解iTunes登录协议的关键字段与签名机制,覆盖证书配置、进程监听、域名过滤等实战经验,辅以Apple

weixin_30768881的博客 193

OC WKWebView的使用

前言 最近项目中的UIWebView被替换为了WKWebView,因此来总结一下。 示例Demo:WKWebView的使用 本文将从以下几方面介绍WKWebView: 1、WKWebView涉及的一些类 2、WKWebView涉及的代理方法 3、网页内容加载进度条和title的实现 4、JS和OC的交互 5、本地HTML文件的实现 一、WKWebView涉及的一些类 WKWebView:网页的渲染与展示 注意: #import <WebKit/WebKit.h> ..

迦南的专栏 1827

Vue Vben Admin 登录页修改全攻略:从登录界面定制到接口对接全流程配置

方式一:修改国际化文件找到对应的语言包文件,修改和的值。方式二:直接传递文本page-description="现代化的后台管理系统模板"page-title="欢迎使用 Vue Vben Admin"从上面的代码可以看出,登录表单使用了的方式来定义表单字段,这种方式提供了极大的灵活性。如果你想要自定义表单,可以修改formSchema数组。如果你的登录需求非常特殊,现有的组件无法满足,你可以完全自定义表单。只需在login.vue中替换<template><h2>自定义登录</h2>

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 478

OC_protocol协议介绍(2)

1 protocol代理设计模式引入 代理模式在OC中经常遇到的一种设计模式,那什么叫做代理模式呢?举个例子:有一个婴儿,本身不会吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情,而保姆是这个代理人,即:婴儿和保姆之间有个协议,保姆遵守该协议,于是保姆就需要实现该协议中的条款称为代理人。 2 protocol代理设计模式概

jiangminyan的博客 511

AI编程工具深度对比:Cursor、Copilot、Trae与Claude Code,2025年开发者该如何选择?

2025年AI编程工具市场已形成四大主力阵营:Cursor(AI原生IDE)、GitHub Copilot(行业标准)、Trae(中国免费方案)和Claude Code(终端交互)。核心差异体现在技术能力(代码生成准确率85%-95%)、智能体协作程度和上下文处理能力(8K-200K tokens)。用户体验方面,Trae对中文支持最佳且免费,Copilot企业集成强,Cursor平衡易用与功能,Claude Code适合高阶开发者。实际测试显示,不同工具在原型开发、算法实现等场景各有优势

fudaihb的博客 6495

高通 vs MTK vs 海思:三大平台 ISP 架构横向对比与实战差异分析

随着移动影像能力成为智能终端差异化竞争的核心维度,ISP(Image Signal Processor)架构日益重要。高通、MTK、海思三大 SoC 厂商在 ISP 设计上各具特色,不仅在图像处理链路、模块集成度、算法加速路径等方面存在显著差异,同时也决定了终端厂商在成像质量、调试复杂度与扩展能力上的实际表现。本文将基于真实平台项目经验,横向对比三大主流平台的 ISP 架构关键指标,系统分析其在实际开发过程中的能力边界、工程成本与调优空间,帮助工程师更精准地进行平台选型与优化策略制定。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3926

04 - Object-C协议与代理设计

##一、 简单使用 ###1. 基本用途 可以用来声明一大堆方法(不能声明成员变量) 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明 只要父类遵守了某个协议,就相当于子类也遵守了 ###2. 格式 协议的编写 @protocol 协议名称 // 方法声明列表 @end ...

枫叶的世界 123

Qwen大模型参数解析

Qwen系列模型的参数主要分为(决定模型结构)和(控制生成行为)两类。由于该系列已迭代多个版本,参数设计也在不断演进,我会结合最新版本为你进行分层梳理。

yeyiboy的博客 164

一键自动修改和翻新OC源码,解决苹果审核4.3和马甲问题

OC项目文件路径包含代码文件与资源文件如下图。

2301_79527134的博客 1074

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

30天学会OC-21:音频与视频播放

本文介绍了iOS中音频和视频播放的基本实现方法。音频播放分为短音频(使用AudioServicesPlaySystemSound)和长音频(使用AVAudioPlayer)两种场景,分别适用于提示音和背景音乐等需求。视频播放通过AVPlayer和AVPlayerLayer或AVPlayerViewController实现,前者提供更灵活的界面定制,后者则提供完整的播放控制界面。文章包含详细的代码示例,展示了如何创建播放器、设置属性、处理播放事件等核心功能,并提及了后台播放和中断处理等高级话题。这些方法为iO

smileKH的博客 1207

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

iOS WKWebView的使用

前言 最近项目中的UIWebView被替换为了WKWebView,因此来总结一下。 示例Demo:WKWebView的使用 本文将从以下几方面介绍WKWebView: 1、WKWebView涉及的一些类 2、WKWebView涉及的代理方法 3、网页内容加载进度条和title的实现 4、JS和OC的交互 5、本地HTML文件的实现 6、WKWebView+UITableView混排 7、WKWebView离线缓存功能 一、WKWebView涉及的一些类 WKWebView:网页的渲染与展示 注意: #i

假装你是大灰狼的专栏 2804

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

iOS 中webView的使用

web的中与js oc的那点事

Obses_sion的博客 1600

AI制作OC动画全流程:从角色一致性到本地部署与批量生成

AI视频生成技术正在改变动画制作的方式,但让同一个原创角色在不同镜头中保持外观一致,始终是创作者最头疼的问题。角色一致性不仅是技术难点,更是决定作品能否被观众认可的关键。本文从图像生成与视频生成的基本原理出发,介绍如何通过Stable Diffusion、ComfyUI、AnimateDiff等开源工具,结合LoRA、IP-Adapter和ControlNet,搭建一套可落地的AI动画流水线。内容涵盖角色设定图生成、关键帧分镜、图生视频、批量任务调度以及补帧剪辑等环节,并对比了本地部署与在线图生视频平台的优

weixin_34008933的博客 614
上一篇: OC视频笔记5.1(类目的概念和使用)5.2(延展)
下一篇: OC视频笔记(内存管理)
v7595v
博客等级 码龄12年 18粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值