Swift学习记录 -- 14.闭包的使用和解决循环引用方法

Mac mini 本地大模型部署:Swift + M 系列芯片实战指南 本地大模型部署正从云端向边缘设备迁移,其核心依赖于高带宽统一内存、专用神经引擎与高效异步编程模型。Apple Silicon 的 M 系列芯片(如 M2 Ultra)通过 800GB/s 内存带宽和 180 TOPS 神经引擎,为 LLaMA-3 等 70B 级模型提供低延迟推理基础;而 Swift 语言凭借对 Metal、ANE 和统一内存的原生支持,将硬件能力封装为简洁 API,实现 `swift urlrequest get` 等操作的透明加速。该技术路径显著降低 AI 应用开发门槛,适用于个人开发者 阅读详情

Swift中的闭包 , 几乎和OC中的block一模一样 , 我个人又比较偏好block , 所以觉得闭包还是蛮不错的 . 在循环引用问题上 , 解决方案也更加简洁


// HttpTool类
import UIKit

class HttpTool: NSObject {

    //闭包写法 : (参数列表) -> (返回值类型)
    func loadData(callBack:(jsonData:String) -> ()) {

        //模拟网络请求 (因为我这里使用的是xCode低版本 , 所以方法名称具体有所不一样,但是写法都是差不多的)
        dispatch_async(dispatch_get_global_queue(0, 0)) { 

            print("发送网络请求 -- \(NSThread.currentThread())")

            //主线程更新UI
            dispatch_async(dispatch_get_main_queue(), { 

                callBack(jsonData: "json数据")
            })
        }
    }


    //模拟网络请求二
    //定义闭包类型属性,存储闭包回调操作
    var backOperation:((jsonData:String) ->())? = nil

    func loadMoreData(backOperation:(jsonData:String) ->() ) {

        //存储操作
        self.backOperation = backOperation

        //子线程请求
        dispatch_async(dispatch_get_global_queue(0, 0)) {

            print("发送网络请求:\(NSThread.currentThread())")

            //主线程回调更新UI
            dispatch_async(dispatch_get_main_queue()) {

//                backOperation(jsonData: "json数据")
                self.backOperation?(jsonData:"json数据")
            }
        }
    }
}
//未涉及循环引用情况 : 
       //创建HttpTool实例对象
        let tool :HttpTool = HttpTool()

        //调用模拟网络请求方法
        tool.loadData { (jsonData) in

            print("获取数据\(jsonData),进行主线程更新UI")
            print(NSThread.currentThread())
        }
        //注意:这种情况已经造成了循环引用 
        //闭包为self.tool属性 , 故指针指向了闭包所在内存地址 . 在下述闭包中, 又访问了self的内存地址进行背景色赋值 .

        //解决办法循环引用方法一: (和OC一致 ,弱化self)
        weak var weakself = self
        tool.loadMoreData { (jsonData) in

            // weakself?的意思是:如果weakself没有值 , 后面的代码将不会执行 , 如果weakself有值 , 那么会自动将weakself进行解包,并执行后续代码
            // 个人觉得这点的设计还是非常人性化的,不知道这个语法前,我就在想,如果一直需要进行if判断,然后解包, 这代码也太烂了
            weakself?.view.backgroundColor = UIColor.redColor()

            print("获取数据\(jsonData) --- 当前线程:\(NSThread.currentThread())")
        }


        //解决循环引用方法二 :  (直接在大括号后,写[weak self],推荐使用)
        tool.loadMoreData {[weak self] (jsonData) in

            //这里的self依然变成可选类型
            self?.view.backgroundColor = UIColor.greenColor()
            print("获取数据\(jsonData) --- 当前线程:\(NSThread.currentThread())")
        }


        //解决循环引用方法三: (不推荐 , 如果self为空, 直接崩溃)
     tool.loadMoreData {[unowned self] (jsonData) in

        self.view.backgroundColor = UIColor.greenColor()
        print("获取数据\(jsonData) --- 当前线程:\(NSThread.currentThread())")
        }
     }


    //备注:
    /*  unowned 很类似于 OC中的__unsafe_unretained , 如果unowned修饰的弱引用,指针指向的对象销毁 , 指针依然指向该内存地址 , 访问僵尸对象,造成'野指针'错误

        weak 就相当于OC中的 __weak ,如果weak修饰的弱引用 ,指针指向的对象销毁, 指针会立即置为nil
    */
    //控制器销毁调用 , 相当于OC中的 dealloc
    deinit {

        print("---控制器销毁")
    }

————– 补充 : 尾随闭包


import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        //尾随闭包:如果闭包作为函数的最后一个参数,那么闭包可以将()省略

        //写法1:
        test ({ (str) in
            print("\(str),world !")
        })

        //写法2:
        test (){ (str) in
            print("\(str),world !")
        }

        //写法3: (系统写法)
        test { (str) in

            print("\(str),world !")
        }
    }
}
//测试函数
func test(bag:(str:String) ->()) {

    print("test ---")
    bag(str: "hello")
}
Swift闭包里强弱引用的那些陷阱和奥秘 在本篇博文中,您将学到以下内容: - 为什么要在闭包中加上[weak self] 和[unowned self]?它们有什么区别? - 是不是闭包中总是要加上[weak self]? - 在闭包中除了用[weak/unowned self] 还有其它消除引用循环的方法吗? - 在闭包中强引用对象的两种方法。 - 不会造成循环引用的值类型在闭包中使用真的是人畜无害吗? 阅读详情

相关推荐

STM32F4串口接收ATGM336H GPS数据,手把手教你解析NMEA协议并转换经纬度格式

本文详细介绍了如何使用STM32F4开发板通过串口接收ATGM336H GPS模块的NMEA协议数据,并解析GNRMC语句获取经纬度信息。内容涵盖硬件连接、NMEA协议深度解析、数据校验实现以及经纬度格式转换的数学原理与代码实现,为嵌入式开发者提供完整的GPS数据处理解决方案。

weixin_42522575的博客 497

xcode swift 闭包不提示扩号内容_iOS错误:SWIFT_VERSION '5.0' is unsupported...

SWIFT_VERSION '5.0' is unsupported, supported versions are: 3.0, 4.0, 4.2.原因:这个项目是用之前的Swift版本做的,现在用最新版的Xcode打开之后,用的是最新版的Swift5版本进行编译,所以不兼容如果这个项目只是演示的话,解决方法:点击主项目-BulidSetting-搜swift-Swift Language Ver...

weixin_39856208的博客 381

UFS Host Controller工作流程

contentsUFS架构图HCI接口架构传输请求接口(Transfer Request Interface)UFS 主机控制器寄存器接口(host controller Interface)UTP 层数据传输Host Software与Host Controller的交互Host Controller初始化配置与控制CRYPTOCFG 配置过程 该文档描述了UFS Host Controller的主要运作流程以及在开源内核代码hisi平台中的host controller的接口函数设计 文档大部分内容参

Frank_sample的专栏 1万+

xcode swift 闭包不提示扩号内容_今年的 Swift,有哪些新的东西呢?

苹果官方在美国当地时间 9.20在 Swift 官方正式官宣了 Swift 5.1。Swift 5.1在Swift 5的基础上扩展了语言的稳定功能。不过等等,本文不是对官宣文档的整理,而是整理自 Xcode 11 release note。Xcode 11 中对 Swift 的支持也有部分更新,包括一些新特性和修复了一些问题。我们在此将与 Swift 相关的内容独立出来。主要是 Swi...

weixin_36317492的博客 476

pwscf与wannier90 Hands-On实战训练(一)——费米面计算为例

系列文章目录 Quantum Espresso Hands-On实战训练(三)——DOS计算 文章目录系列文章目录计算过程pwscf直接得到等能面pwscf和wannier90得到等能面pwscf直接得到等能面1. scf2. nscf3. 后处理pwscf和wannier90得到等能面1. Kpoints2. scf3. nscf4. pw2wan及wannier90.x5. XCrySDen可视化 计算过程 pwscf直接得到等能面 pwscf和wannier90得到等能面 pwscf直接得到等能面

weixin_45973682的博客 5070

Klipper-源码模块

Klippy上位机程序采用多线程架构,包含四个主要进程:主线程处理G代码命令、串口IO线程(C语言实现)、MCU响应处理线程(Python实现)和独立日志线程。代码结构分为三大模块:chelper(C语言辅助函数)、extras(扩展功能如温度控制)和kinematics(运动学模型实现)。核心功能模块包括串口通信(serialhdl.py)、步进电机控制(stepper.py)、运动学计算等,其中C语言实现的底层模块通过serialqueue.c处理高效IO。扩展模块支持热床、传感器等外设,运动学子模块提

weixin_44258581的博客 991

swift指针&内存管理-闭包的循环引用

无主引用 - swift实例内存空间引用存储方式为如何 闭包循环引用 - 强引用 弱引用存储方式 deinit执行逻辑 强应用,导致deinit不执行的真正逻辑是什么 闭包捕获列表参数的理解 闭包解决循环引用的方式 闭包延长实例的声明周期 两种方式

coding不死,也未曾凋零 1854

Python经常遇到导入xlwings就出错,如何解决

Python经常在导入xlwings时遇到错误。有人建议尝试重装或升级xlwings,但这些操作后仍然无法解决导入错误问题。

felix_8的博客 1740

swift学习--闭包的循环引用解决

一、什么是循环引用、怎么发生的      循环引用就是当self 拥有一个block的时候,在block 又调用self的方法。形成你中有我,我中有你,谁都无法将谁释放的困局。     在oc中,通常解决block循环引用的办法就是weak来修饰self!     __weak typeof self (weakself) = self     swift中的闭包等于OC中的block,因

HPerry的博客 680

YoloV8优化:感受野注意力卷积运算(RFAConv),效果秒杀CBAM和CA等 | 即插即用系列

感受野注意力卷积运算(RFAConv),解决卷积块注意力模块(CBAM)和协调注意力模块(CA)只关注空间特征,不能完全解决卷积核参数共享的问题

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 4264

使用Verilog实现QR分解——嵌入式 [设计与代码]

通过Verilog的硬件描述语言,我们可以将QR分解算法实现为硬件电路,并在嵌入式系统中高效地运行。本文将介绍如何使用Verilog设计并实现QR分解算法,该算法用于将一个矩阵分解为正交矩阵Q和上三角矩阵R。具体而言,QR分解通过对矩阵的列进行正交化处理,得到正交矩阵Q,并将对应的正交化结果存储在上三角矩阵R中。该算法通过将矩阵分解为两个部分,正交矩阵Q和上三角矩阵R,实现了对矩阵的分解和变换。模块,该模块接收待分解矩阵A,并输出正交矩阵Q和上三角矩阵R。下面给出了使用Verilog实现QR分解的源代码。

CodeMaven的博客 620

Swift闭包详解:从基础到高级应用

闭包是Swift语言中的核心特性,本质上是一个自包含的功能块,可以在代码中被传递和使用。其核心原理是捕获并存储所在上下文中的常量和变量引用,这使得闭包能够访问这些值即使原作用域已不存在。在工程实践中,闭包的价值体现在简化回调处理、实现高阶函数、支持函数式编程范式等方面。典型的应用场景包括集合操作(如map、filter)、异步网络请求、UI事件处理等。特别是在SwiftUI框架中,闭包被广泛用于状态绑定和视图修饰。值得注意的是,闭包捕获机制可能引发循环引用问题,需要通过[weak self]等技术手段进行内

weixin_30732487的博客 320

第14.11章 高翔博士最新开源框架Lightning-LM源码解读(十一):离线定位模块全解析,从激光匹配到位姿图优化的极致优化

本文介绍了Lightning-LM离线定位模块的技术架构与实现细节。该模块基于3D激光雷达与IMU融合,采用改进版NDT匹配算法实现高精度定位,具备动态图层更新、多源信息融合等特性。核心流程包括数据预处理、激光里程计处理、IMU预测与点云去畸变、位姿图优化等环节,通过轻量级miao库实现高效增量优化。文章详细解析了模块的代码结构、关键函数功能及数据流,为SLAM系统的开发与优化提供了实践参考。

行知SLAM 375

Swift学习初学第一步

Swift学习之路基础部分学习了解变量基本运算符字符串和字符集合类型数组 Array控制流while, repeat-while区间、元组guard函数可变参数 基础部分学习了解 以前都是用笔记记录自己学习的历程,后来想想 还是写个博客,相信也有很多兄弟都是在学习的道路上坎坎坷坷,不知所措,那就来一群志同道合的朋友一起慢慢探索学习吧,在艰难的奋斗之路上不再孤单! 在学习swift之前,先去了解一下swift基本数据 下面也是借鉴了前辈的文章 变量 运算符基本所有的语言都通用,不过swift含有可选类型,故引

qq_37333981的博客 678

计算机控制技术及应用

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

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

《Learn X in Y minutes》Swift 速成指南全解读:基于 learnxinyminutes-docs 的 Swift 核心语法实战

> 本文以 learnxinyminutes-docs 仓库中的土耳其语 Swift 教程 [tr/swift.md](https://link.gitcode.com/i/8acbc351ba98fe852c3a0fcdd3e60c68) 为主线,结合仓库根目录的英文原版 [swift.md](https://link.gitcode.com/i/db6e5bdad4af112db3e153d8

gitblog_00699的博客 1127

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

SwiftNIO 事件循环、Future 与 Swift 并发:隔离域与数据竞争安全的完整实战指南

> 本文是 [loops-futures-concurrency.md](https://link.gitcode.com/i/7191b0a5c549f7c6fb34f9cb0c98814e) 的深度展开。SwiftNIO 的 `EventLoop` 与 `EventLoopFuture` 早于 Swift 并发模型而诞生,如何在 Swift 6 的区域隔离(region-based isola

gitblog_00658的博客 1039

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

每天学一点Swift----面向对象下(十)

十九. Swift内存管理 1. Swift提供了强大的内存管理机制:Swift通过自动引用计数(ARC)可以很好地管理对象的回收。大部分时候,程序无须关心Swift对象的回收,但在某些特殊情况下,Swift要求程序员进行一些内存管理的处理。 2. 只有引用类型变量所引用的对象才需要使用引用计数进行管理,对于枚举、结构体,他们是值类型,因此不需要使用引用计数进行管理。 3.

u014471160的博客 479

Swift 构建错误专项解析:解读 ECC 的 swift-build-resolver 修复 Agent 方法论

> 导读:本文以 ECC 仓库中的 [agents/swift-build-resolver.md](https://link.gitcode.com/i/c083664492eb76ee9482a825dabcdc5e) 为骨架,系统拆解 Swift/Xcode 编译失败、SPM 依赖解析异常与代码签名问题的「最小化外科手术」式排查与修复流程。读完你将掌握一套可直接落地的诊断命令序列、14 类高

gitblog_00594的博客 450

Fugu14越狱工具实战指南:解锁iOS 14系统的完整教程

Fugu14是一款针对iOS 14.3-14.5.1系统的**无限制越狱工具**,通过创新的技术方案实现了完美越狱体验。无论你是iOS安全研究员还是技术爱好者,本指南将带你深入了解Fugu14的技术实现、安装部署和进阶使用技巧。 ## 🎯 为什么选择Fugu14:解决传统越狱的痛点 传统的iOS越狱工具往往存在诸多限制:重启后失效、兼容性差、稳定性不佳。Fugu14通过创新的技术架构解决了这

gitblog_00723的博客 964

显式闭包捕获:从隐式依赖到生命周期安全的语言设计对比

闭包是现代编程语言中函数式编程的核心机制,而捕获列表决定了闭包如何访问外部变量。默认的隐式捕获虽然简洁,却容易引发生命周期悬空、共享状态竞争和隐藏依赖等问题。显式捕获通过语法层面明确定义按值、按引用、弱引用或所有权转移,让闭包的行为可预测、可审查。从C++的初始化捕获、Swift的weak/unowned,到Rust的move与所有权检查,不同语言在捕获粒度与安全性之间做出不同权衡。理解这些设计差异,有助于在异步、并发或资源管理场景下正确使用lambda表达式。文章对比主流语言的捕获实现,提炼工程可落地的设

weixin_30443747的博客 411

Swift 版本历年更新记录(核心里程碑 + 关键特性)

Swift 版本更新节奏:早期每年 1-2 个版本,2019 年后趋于稳定(每年 1 个主版本 + 1 个小版本);核心演进方向:从“语法优化”→“ABI 稳定”→“并发模型”→“内存安全/宏系统”,逐步向“高性能、高安全、跨平台”迭代;关键节点:Swift 5.0(ABI 稳定)、Swift 5.5(并发革命)、Swift 6.0(严格并发)是三个最具里程碑意义的版本。

denggun12345的博客 924

从 CONTRIBUTING 看 Reachability.swift 的提问题南与常见故障排查实战

本文以 [CONTRIBUTING.md](https://link.gitcode.com/i/36b0e880a6b2fbaee6033b6055a0f116) 为骨架,结合 [Sources/Reachability.swift](https://link.gitcode.com/i/ceeefc012c859956799b7ada72349e34)、[Tests/ReachabilityT

gitblog_00992的博客 214

Eureka 5.5.0 版本演进史:从 Swift 3 迁移到 Apple 隐私合规的 iOS 表单框架 CHANGELOG 全解析

Eureka 是一款基于 Swift 的优雅 iOS 表单构建框架,其 [CHANGELOG.md](https://link.gitcode.com/i/e97db5ab221c7d8d148ca7cf8fcf42e0) 完整记录了从 2015 年 1.0.0 首发到 5.5.0 的每一个里程碑:既有 Swift 3/4/5 大版本迁移与 API 重命名(配合 Eureka 2.0 Migrat

gitblog_00025的博客 490

Swift - 风格指南

在看objc出版的《Swift进阶》中,看到编程风格习惯的内容,觉得很不错。所以这里记录下来,希望我们在自己的项目中使用 Swift 代码时,也应该尽量遵循如下的原则: 1:对于命名,在使用时能清晰表意是最重要。因为API被使用的次数要远远多于被声明的次数,所以我们应当从使用者的⻆度来考虑它们的名字。尽快熟悉 Swift API 设计准则,并且在你自己的代码中坚持使用这些准则。

欢迎来到Jack的程序世界 363

Swift 非拷贝(Noncopyable)结构体与枚举完全指南:基于 SE-0390 的唯一所有权类型实战解析

Swift 5.9 通过 [SE-0390](https://link.gitcode.com/i/4896795bf19318d0f0f8396086269aa5) 引入了**非拷贝类型(noncopyable types)**,也称"move-only"类型:这类结构体与枚举的实例拥有唯一所有权,任何时刻只能存在一份,无法被隐式复制。本文以该提案为骨架,系统讲解 `~Copyable` 约束抑

gitblog_00893的博客 159

Swift 语言指南-Issue 43

Swift 语言指南-Issue 43 本期特别推荐 1. 项目:Filterpedia(完整、强大的图片滤镜类库)、ElasticTransition(畅快、无违和感的皮筋式动画转场)以及 VWInstantRun(Xcode 高效调试插件); 2. 文章:如何在Swift中调用 C 库 和 如何使用 Swift、Foursquare API 及 Realm 构建一款 Coffee Shop...

swiftlab的博客 336
上一篇: Swift学习记录 -- 13.类的构造方法及属性监听
下一篇: Swift学习记录 -- 15.tableView的创建与基本操作
coderMy
博客等级 码龄10年 43粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值