ARC(Automatic Reference Counting)自动引用计数 unowned、weak 使用区别
2024-09-08 10:57:21
自动引用计数
引用类型(类、函数、闭包) 当声明一个变量指向某个引用类型时 当前引用类型的引用计数就会加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]
*/
最新文章
- State(状态)
- 熔断器设计模式<;转>;
- bzoj1877: [SDOI2009]晨跑
- Codeforces Problem 598E - Chocolate Bar
- 从文章";避免复制与粘贴";到文章";Extract Method";的反思(1)
- Flume配置
- Java学习之Comparable与Comparator的区别
- 异常:未能载入文件或程序集”DAL”或它的某一个依赖项——解决的方法
- Leetcode题解(八)
- SpringBoot使用Sharding-JDBC读写分离
- DVWA 黑客攻防演练(二)暴力破解 Brute Froce
- 【Spark-SQL学习之二】 SparkSQL DataFrame创建和储存
- Day4--Python--列表增删改查,元组,range
- read_csv报错Initializing from file failed
- 用Canvas做动画
- 迷你MVVM框架 avalonjs 学习教程12、数据联动
- Java之JVM调优案例分析与实战(4) - 外部命令导致系统缓慢
- Python 打包程序
- Eclipse下无法解析注解:@Getter和@Setter
- django notes 一:开篇
热门文章
- Mac 如何用python下载Mac OS
- CF1268B题解
- Linux网络第五章:yum仓库的灵活部署及NFS共享服务
- DOM状态监听(观察者模式)
- TreeView控件的基本用法
- 使用Telnet伪造邮件发送
- HCIP-进阶实验05-Eth-Trunk配置部署
- 初学银河麒麟linux笔记 第三章 QT缺少的模块下载、更新软件源操作
- LCP 03.机器人大冒险
- version libcrypto.so.10 not defined in file libcrypto.so.10 with link time reference