swift 代理知识点总结

news/2026/1/27 10:54:35/文章来源:https://www.cnblogs.com/jiushi8888/p/19537132

1.定义协议
protocol ProVBDelegate:AnyObject { func back(data:String) }
AnyObject 作用是提示这个代理只能被类使用 (不能使用 weak)
如果代理方法是可选的需要这样实现如下
@objc protocol ProVBDelegate:AnyObject { @objc optional func back(data:String) }
2.委托方(委托持有者)
(1)声明代理属性 (结构体的时候 不使用weak )
weak var proVBDelegate:ProVBDelegate?
(2)需要的时候调用协议方法
proVBDelegate?.back?(data: "传递的参数")
3.代理方
(1)跳转的地方设置代理
@objc func sendData() { // 跳转到ProtocolViewControllerB let vcB = ProtocolViewControllerB() vcB.proVBDelegate = self navigationController?.pushViewController(vcB, animated: true) }
(2)最好写一个 extension 继承代理 实现代理方法 代码整洁可维护性高
extension ProtocolViewControllerA:ProVBDelegate{ func back(data: String) { print("VB2传递过来的参数\(data)") } }
代理循环引用

  1. ARC 内存管理基础
    Swift 使用自动引用计数(ARC)来管理内存

每个对象都有一个引用计数器

当引用计数为 0 时,对象会被销毁

循环引用会导致双方引用计数都无法归零

  1. 循环引用形成的典型场景
    swift
    class ViewController {
    var delegate: SomeDelegate? // 强引用
    }

class DataModel: SomeDelegate {
var controller: ViewController? // 强引用

init() {controller = ViewController()controller?.delegate = self  // 互相强引用!
}

}
3.为什么weak 可以避免循环引用
weak 的实现机制:
不增加引用计数

(1)weak 引用不会增加对象的引用计数

当对象被释放时,weak 引用会自动变为 nil

(2)Swift Runtime 的实现:

weak 引用实际上是一个指向对象侧表(side table) 的指针

侧表包含对象的弱引用计数等信息

当强引用计数为 0 时,对象内存被释放,所有弱引用自动置为 nil
4.delegate 跟 闭包比 的优点缺点
Swift 代理与闭包的对比

代理模式 (Delegate Pattern)

优点
职责分离清晰​ - 将功能委托给专门的类,符合单一职责原则
协议约束​ - 通过协议强制实现必需方法,编译器可检查
可维护性强​ - 接口明确,代码结构清晰
多对一关系​ - 一个代理可为多个对象服务
避免循环引用​ - 使用 weak引用可避免内存泄漏
可扩展性​ - 可定义可选方法,通过协议扩展提供默认实现
缺点
代码量多​ - 需要定义协议和实现类
相对繁琐​ - 简单的回调场景显得过于复杂
传递链复杂​ - 多层传递时代理链可能较长
闭包 (Closure)

优点
简洁灵活​ - 代码紧凑,适合简单回调
上下文捕获​ - 自动捕获上下文变量
即用即写​ - 不需要单独定义协议和方法
链式调用​ - 适合链式操作和函数式编程
异步友好​ - 在异步编程中表达清晰
缺点
循环引用风险​ - 需要手动使用 [weak self]等避免
可读性降低​ - 复杂逻辑写在闭包中可能难以维护
调试困难​ - 堆栈跟踪不如方法调用清晰
类型安全​ - 需要明确定义闭包类型,否则编译器提示有限
5.代理跟 通知比较优点缺点
通知模式 (Notification Pattern)

优点
完全解耦​ - 发送者和接收者无需相互知道对方的存在
一对多广播​ - 一个通知可以被多个观察者接收
全局通信​ - 适合应用级别的全局事件
跨模块通信​ - 不同模块间通信的理想选择
灵活性高​ - 可动态添加/移除观察者
缺点
类型不安全​ - 传递的数据是 Any?类型
编译时不检查​ - 拼写错误不会在编译时发现
难以调试​ - 通知链路复杂时难以追踪
内存管理​ - 需要手动移除观察者
可读性差​ - 通知名通常为字符串常量
代理模式 (Delegate Pattern) - 回顾

优点
类型安全,编译时检查
接口明确,代码结构清晰
避免循环引用
可扩展性强
缺点
一对一关系(通常)
发送者和接收者需要相互引用
代码量较多

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1223672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线性映射算法(DAW软件可用)

线性映射算法(DAW软件可用)function linearMap(knobValue, minKnob, maxKnob, minValue, maxValue) {// 将旋钮值从一个范围映射到另一个范围return (knobValue - minKnob) / (maxKnob - minKnob) * (maxValue - min…

2026年双光束红外分光光度计:哪家质量优、口碑好、性价比高

一、行业发展趋势 市场规模与技术演进 双光束红外分光光度计作为光谱分析领域的核心设备,其全球市场规模在2025年已突破28亿美元,年复合增长率达6.8%(数据来源:MarketsandMarkets《2025年全球光谱分析设备市场报告…

如何通过Java SDK描述Collection

本文介绍如何通过Java SDK获取已创建的Collection的状态和Schema信息。 前提条件已创建Cluster 已获得API-KEY 已安装最新版SDK接口定义 Java // class DashVectorClientpublic Response<CollectionMeta> descri…

矩形命中检测函数(多用于UI的按钮检测)底层数学算法

矩形命中检测函数(多用于UI的按钮检测)底层数学算法function hitTest(x, y) {if (x >= rect.x && x <= rect.x + rect.width && y >= rect.y && y <= rect.y + rect.height){re…

卧式开箱机怎么选?盘点值得关注的制造厂家,电商封箱机/全自动包装流水线/机器人码垛机/三维膜包装机,开箱机制造企业电话

在自动化浪潮席卷制造业的今天,后道包装环节的智能化升级已成为企业降本增效、提升竞争力的关键。卧式开箱机作为自动化包装线的核心设备之一,因其高效、稳定、节省人力的特点,被广泛应用于食品、饮料、日化、电子、…

Linux 命令:pr

概述 Linux 中的 pr 命令是专业的文本格式化打印工具&#xff0c;核心作用是对文本文件进行分页、加页眉、分栏、编行号等排版处理&#xff0c;模拟打印机的输出格式&#xff0c;适合将纯文本整理为规范的打印稿/文档&#xff0c;比 nl/fold 功能更全面&#xff0c;是批量格式…

HGWatcher使用说明

文章目录 文档用途详细信息 文档用途 本文介绍HGWatcher的功能、安装方式及使用方法&#xff0c;并提供HGWatcher更新说明及下载地址。 详细信息 简介 HGWatcher是一个定期收集HGDB、PostgreSQL及其所运行的操作系统的信息的工具&#xff0c;用以在数据库或操作系统出现问题…

2026Q1成都财税公司推荐 公司注册工商变更哪家好 一站式财税服务商优选

2026年Q1,成都财税行业规范化水平持续提升,金税四期全面监管常态化,叠加资质审批流程优化,企业对财税服务的专业性、全面性需求愈发迫切,其中公司注册、工商变更作为企业初创及经营中的基础刚需,搭配代理记账、财…

2026年海湾园公墓联系电话推荐:基于环境与人文场景评测,解决信息查询与沟通痛点

摘要 在生命服务领域,选择一处合适的安息之所或纪念之地,是家庭面临的重要决策。当前,随着社会观念演进与市场需求多元化,公墓不再仅是基础殡葬服务的提供者,其环境、文化内涵、管理规范及长期维护能力日益成为决…

羽动金城,焰燃热爱!2026 甘肃羽毛球培训首选赤焰体育

在甘肃兰州的体育培训赛道上,赤焰体育始终以专业为帆、以热爱为舵,深耕体育教育领域多年,成为无数家庭和企业信赖的运动伙伴。作为一家专注于体育运动普及的教学培训机构,赤焰体育自 2020 年成立以来,便秉持 “快…

攻防世界warmup

攻防世界warmupPosted on 2026-01-27 10:47 看雪? 阅读(0) 评论(0) 收藏 举报点开网页就是一个贴吧老哥的经典表情,按照惯例按F12.注释里有个source.php,去看看有啥内容 `<?php highlight_file(FILE); cla…

告别期刊投稿“石沉大海”!虎贲等考AI重构论文创作逻辑,精准命中见刊标准

每一位科研人、学者都懂这种挫败感&#xff1a;耗时数月打磨的期刊论文&#xff0c;要么因选题不符被秒拒&#xff0c;要么因格式疏漏反复返修&#xff0c;要么因查重超标、AI痕迹明显卡在审核环节&#xff0c;最终沦为“抽屉论文”。期刊投稿的核心痛点从不是研究本身&#xf…

告别 “文字墙” 与 “模板感”:虎贲等考 AI PPT 重构学术演示的叙事美学

学术演示的终极较量&#xff0c;从来不是谁的模板更花哨&#xff0c;而是谁能在有限时间内&#xff0c;用可视化语言讲清研究价值。不少科研人耗费数月打磨论文&#xff0c;却栽在 PPT 上 —— 要么把万字论文生硬搬运成 “文字墙”&#xff0c;评委抓不住核心&#xff1b;要么…

别让 AIGC 痕迹毁了论文!虎贲等考 AI 降重黑科技:合规改写,还保学术质感

论文写完却卡在 “重复率超标”“AIGC 疑似度高”&#xff1f;提交前反复修改&#xff0c;要么越改越乱&#xff0c;要么改完失去学术逻辑&#xff1f;作为深耕论文写作科普的博主&#xff0c;我太懂这种崩溃 —— 降重不是 “乱改字词”&#xff0c;降 AIGC 也不是 “破坏原文…

Python异步编程基石:深入理解asyncio核心原理与实战

Python异步编程基石&#xff1a;深入理解asyncio核心原理与实战&#xff08;2025–2026 现代实践版&#xff09; asyncio 是 Python 3.4 标准库中引入的异步编程框架&#xff0c;它基于协程&#xff08;coroutine&#xff09;和事件循环&#xff08;event loop&#xff09;&am…

USB Type-C:定义与功能全解析终极指南

目录 USB Type-C 端口定义全解析 一、物理结构与核心特性 1. 基础形态 2. 核心设计原则 二、完整引脚定义&#xff08;A/B 排对照&#xff09; 关键引脚详解 1. 电源系统&#xff08;VBUS/GND&#xff09; 2. 核心控制通道&#xff08;CC1/CC2&#xff09; 3. 数据传输…

苏州硕士留学中介top10盘点,录取案例多!选择技巧全解析

苏州硕士留学中介top10盘点,录取案例多!选择技巧全解析一、苏州硕士留学如何选中介?资深导师为你解析核心痛点面对苏州地区硕士留学市场的众多选择,许多同学与家长常陷入几个典型困境:如何从数十家机构中筛选出真…

天津研究生留学机构top10,稳定可靠!助你顺利留学

天津研究生留学机构top10,稳定可靠!助你顺利留学一、天津学生如何选择靠谱的留学中介?在搜索引擎上,许多天津高校的学子会频繁搜索“天津留学中介哪家好”、“天津研究生申请机构推荐”等问题。核心关切在于,本地…

香港研究生留学中介哪家强?口碑排名最新发布,学员满意度高

香港研究生留学中介哪家强?口碑排名最新发布,学员满意度高一、香港研究生留学中介如何选择?许多计划赴港深造的同学在搜索引擎中常会询问:“香港研究生留学中介哪家更可靠?”、“如何依据口碑选择中介?”以及“哪…

想知道武汉研究生留学机构口碑排名?无隐形消费是关键

想知道武汉研究生留学机构口碑排名?无隐形消费是关键一、如何寻找口碑与透明度兼优的武汉留学中介?近年来,在搜索引擎中,“武汉研究生留学机构哪家靠谱”、“武汉留学中介真实评价”以及“如何避免留学中介的隐形消…