ARC(Automatic Reference Counting)自动引用计数 unowned、weak 使用区别
自动引用计数
引用类型(类、函数、闭包) 当声明一个变量指向某个引用类型时 当前引用类型的引用计数就会加1 当变量不指向该类型时 引用类型就会 -1
当引用计数为0时 当前引用类型就会被系统回收
import UIKit class Author { var name: String var video: Video? init(name: String) { self.name = name } deinit { print("Author 被销毁了") } } class Video { var at: Author? init(author: Author?) { at = author } deinit { print("Video 被销毁了") } } class ViewController: UIViewController { var author: Author? var video: Video? override func viewDidLoad() { super.viewDidLoad() author = Author(name: "jack") video = Video(author: author) // author?.video = video // author?.video = nil // video?.at = nil // author = nil video = nil // Do any additional setup after loading the view. } } //若上所示 author与video就被销毁了 /* 分析 初始化author author对象的引用计数加+1 video中也传入author 那么当前author 计数为2 如果想让当前的author被释放 那么它的引用计数需都为0
需要将vide中的author 也置位空 若只是单纯的 将author = nil 与video = nil 当前对象依然被其他其他对象的变量指向着 所以便不能被释放 */注意事项 可选可置空对象不要定义成懒加载
弱引用于无主引用
import UIKit class Author{ var name:String weak var video:Video? init(name:String) { self.name = name } deinit { print("Author 被销毁了") } } class Video{ unowned var at:Author init(author:Author) { self.at = author } deinit { print("Video 被销毁了") } } var author:Author? = Author(name: "jack") var video:Video? = Video(author: author!) author?.video = video author = nil video = nil /* 默认创建的对象都是强引用类型 适用于自动引用计数 如果不想适用于自动引用计数 那么创建的变量就需要被unowned 和 weak 修饰 unowned 无主人引用 适用于非可选形 weak 弱引用 适用于可选项 */
若将其中一个对象的属性声明去掉weak或 unowned
执行author = nil video = nil 该两个对象依然会被释放 、
这种情况其实和代理声明为啥用weak一样
import UIKit class Author{ var name:String var video:Video? init(name:String) { self.name = name } deinit { print("Author 被销毁了") } } class Video{ unowned var at:Author init(author:Author) { self.at = author } deinit { print("Video 被销毁了") } } var author:Author? = Author(name: "jack") var video:Video? = Video(author: author!) author?.video = video author = nil video = nil
/* 当一个闭包作为一个函数的参数,并且是非逃逸闭包时 在闭包中使用当前对象的属性 不需要加self 其他情况均需要加self */ class person{ var name:String = "" var age:Int = 0 init(name:String,age:Int) { self.name = name self.age = age } lazy var info:() -> String = {[unowned self] () -> String in return "我的名字叫\(self.name),年纪\(self.age)了" } deinit { print("pseson释放") } } var p:person? = person(name: "jack", age: 18) print(p!.info()) p = nil // 打印 //我的名字叫jack,年纪18了 //pseson释放 /* 由于info 闭包捕获了当前对象 要对当前对象进行弱引用 需要在闭包中说明对当前对象进行弱 及在闭包最前面 申明弱引用 [unowned self] */
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构