Swift 内存管理

news/2024/7/20 15:52:52 标签: 内存管理, swift

1、Object-C 经历两个阶段: 1、手动引用计数内存管理(Manual Reference Counting,MRC) 2、自动引用计数内存管理(Automatic Refernce Counting,ARC)

2、引用类型 内存分配到 堆 上,需要人为管理。 值类型 内存分配到 栈 上,有处理器管理。

3、每个类创建的对象都有一个内部计数器,这个计数器跟踪对象的引用次数,成为 引用计数(Reference Count,简称 RC)。当对象被创建时候,引用计数为1,每次对象被引用的时候会是其引用计数加1,如果不需要的时候,对象引用断开(赋值 nil),其中引用计数 减1.当对象引用计数为 0 的时候,对象内存才被释放。

  备注:init(){}  类的构造方法中 会将实例与对象建立"强引用" 关系, deinit{} 析构方法 只有当引用计数为 0 时候才会执行。

4、强引用循环:

  当两个对象的存储属性相互引用对方的时候,一个对象释放的前提是对方先释放,另一个对象释放前提也是对象先释放,这样就会导致"死锁"的状态,导致内存泄露。

解决强循环 两种方式:1、弱引用 2、无主引用。

  弱引用:允许其中一个对象不采用强引用类型方式引用另外一个对象,这样就不会引起强引用循环问题。弱引用适合与 引用对象可以没有值的情况,因为弱引用可以没有值,我们必须讲一个弱引用 声明为可选类型,使用weak 声明弱引用。

  例如:员工A类 存储属性 部门, 部门B类  部门领导(员工), 如果部门可以没有 部门领导,那么可以将 B类 部门领导 属性 使用 weak 修饰, 那么A、B 之间不存在循环引用。

 

  无主引用:其中一个对象不采用强引用另外一个对象。无主引用适用于引用对象永远有值情况,它总是被定义为非可选类型,使用关键字unowned。

  例如:一个员工可以没有部门,一个部门必须有部门领导,那么可以将B类  unowned var manager :Employee ,建立无主引用。

5、lazy 修饰表示 延迟加载。 lazy var fullName:()->String={ return a+b} ,类的属性 可以在闭包中使用,必须使用 lazy 延迟加载,及所有属性初始化后,self表示对象才会被创建和使用。

6、闭包引用循环: 如果闭包与捕获对象总是相互引用并且总是同时销毁,则将闭包内的捕获声明为无主引用。

           当捕获的对象有可能为nil时,则将闭包内的捕获声明为 弱引用。如果捕获的对象绝对不会为nil,那么采用无业引用。

 

转载于:https://www.cnblogs.com/pengzhaov/p/4433288.html


http://www.niftyadmin.cn/n/1750577.html

相关文章

是的,不修改源码可以直接原地升级 Pod!

更多奇技淫巧欢迎订阅博客:https://fuckcloudnative.io前言OpenKruise[1] 是阿里云开源的大规模应用自动化管理引擎,在功能上对标了 Kubernetes 原生的 Deployment / StatefulSet 等控制器,但 OpenKruise 提供了更多的增强功能如:…

关于iOS中block如何实现的探究

/* ---------------------------------------------------------------------------------------------------- */ [0. Brief introduction of block] Block是iOS4.0 和Mac OS X 10.6 引进的对C语言的扩展,用来实现匿名函数的特性。 用维基百科的话来说&#xff0…

创建 macvlan 网络

上一节我们准备好了 macvlan 的实验环境,今天在 host1 和 host2 中创建 macvlan 网络 mac_net1: 注意:在 host2 中也要执行相同的命令。 ① -d macvlan 指定 driver 为 macvlan。 ② macvlan 网络是 local 网络,为了保证跨主机…

2020年了,DDD还有价值吗?

很多朋友在后台留言问一些关于DDD的问题:“大公司里面 DDD 用得多吗?”,“DDD有用吗?”,“二面就一个DDD没说好,今天问 HR 说挂了”,等等。首先,我们日常开发中,经常会遇…

ICS4.0.3 切换到tablet模式,systemUi报错

在system/build.prop里加上一句 qemu.hw.mainkeys1

什么鬼,Kubelet 重启之后容器也跟着重启了?

更多奇技淫巧欢迎订阅博客:https://fuckcloudnative.io1. 问题描述在修复 cgroup 泄漏问题时会现停掉 kubelet,待修复完成后启动 kubelet 组件,重启后收到业务反馈,业务容器重启了。2. 问题排查这个问题具体原因的排查还是花了一定…

C++中重载,重写,隐藏的区别

重载: 重载是指在同一个作用域下,函数的函数名相同,但是函数参数的个数,或者参数的类型,参数的顺序不同。这时函数之间就构成了重载关系,这里需要注意的是,如果函数的参数列表完全相同&#xff…

jQuery选择id属性带有点符号元素的方法

2019独角兽企业重金招聘Python工程师标准>>> 如果jquery要选择的元素id中带有点符号,在选择时需要在点前面加上两个反斜杠,如 $("#business\\.id").text("xxx") 转载于:https://my.oschina.net/u/914897/blog/403687