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,那么采用无业引用。
Swift 内存管理的更多相关文章
- Swift 内存管理详解
Swift内存管理: Swift 和 OC 用的都是ARC的内存管理机制,它们通过 ARC 可以很好的管理对象的回收,大部分的时候,程序猿无需关心 Swift 对象的回收. 注意: 只有引用类型变量所 ...
- swift内存管理中的引用计数
在swift中,每一个对象都有生命周期,当生命周期结束会调用deinit()函数进行释放内存空间. 观察这一段代码: class Person{ var name: String var pet: P ...
- Swift内存管理-示例讲解
具体而言,Swift中的ARC内存管理是对引用类型的管理,即对类所创建的对象采用ARC管理.而对于值类型,如整型.浮点型.布尔型.字符串.元组.集合.枚举和结构体等,是由处理器自动管理的,程序员不需要 ...
- swift 内存管理,WEAK 和 UNOWNED
因为 Playground 本身会持有所有声明在其中的东西,因此本节中的示例代码需要在 Xcode 项目环境中运行.在 Playground 中可能无法得到正确的结果. 不管在什么语言里,内存管理的内 ...
- Swift内存管理、weak和unowned以及两者区别
Swift 是自动管理内存的,这也就是说,我们不再需要操心内存的申请和分配.当我们通过初始化创建一个对象时,Swift 会替我们管理和分配内存.而释放的原则遵循了自动引用计数 (ARC) 的规则:当一 ...
- Swift内存管理、weak和unowned以及两者区别(如何使用Swift 中的weak与unowned?)
Swift 是自动管理内存的,这也就是说,我们不再需要操心内存的申请和分配. 当我们通过初始化创建一个对象时,Swift 会替我们管理和分配内存.而释放的原则遵循了自动引用计数 (ARC) 的规则:当 ...
- swift内存管理:值类型与引用类型
Use struct to create a structure. Structures support many of the same behaviors as classes, includin ...
- swift内存管理
为了解决引用循环的问题. However, with ARC, values are deallocated as soon as their last strong reference is rem ...
- Swift中的可选链与内存管理(干货系列)
干货之前:补充一下可选链(optional chain) class A { var p: B? } class B { var p: C? } class C { func cm() -> S ...
随机推荐
- js中this揭秘
前端面试题中经常会考this指向问题,初学者通常都会晕头转向,不知所以然.今天我就来讲讲js中this指向问题. this指向大概分为5种情况,记住这6个规律,基本上面试题都能解决. 通过圆括号直接调 ...
- git忽略特殊文件或文件夹
1.在项目目录中添加“.gitignore”文件,项目目录就是你存放git工程的目录就是有“.git”目录的目录 vi .gitignore 2.在文件中添加如下内容,其中“/runtime/”是忽略 ...
- arp命令 清arp表
平常删除arp都用arp-d.大量存在的时候 arp -n|awk '/^[1-9]/ {print arp -d $1}' | sh 清除所有arp表,以前用这个来清arp表貌会清空,没注意到存在i ...
- mongod 一些命令汇总
1. 导出数据库: mongoexport -d master -c reports -o no.json --type json -f "title,name" -q '{&qu ...
- 浏览器被hao123,hao524劫持的解决办法
今天研究(翻,墙),装了几个插件,什么云帆.外遇.蓝灯 后来我的google浏览器被hao123劫持,百度浏览器被hao524劫持 删除浏览器快捷方式.属性目标里的后缀,过不多久又被劫持,把我搞毛了 ...
- Cannot read property ‘msie’ of undefined错误原因以及解决方案
最近把一个项目的jQuery升级到最新版,发现有些页面报错Cannot read property ‘msie’ of undefined.上jQuery网站上搜了一下,$.browser这个api从 ...
- 更快的速度、更好的服务——易普优APS云排程
众所周知软件执行效率受制于硬件性能,市面上的APS产品多为单机版本,企业要应用好APS,保证紧急插单.计划下发全程无忧,用户电脑硬件性能是不容忽视的一大瓶颈.APS的直接用户是车间管理人员.计划员,而 ...
- Haproxy 开启日志记录
CentOS 7上yum安装的Haproxy,默认没有记录日志.需要做一下配置才能记录日志.(不知道其他版本是否需要,已经忘记了)主要是用到了Haproxy,以前貌似没有这么麻烦,今天配置出了一些问题 ...
- poj1847 Tram(Dijkstra || Floyd || SPFA)
题目链接 http://poj.org/problem?id=1847 题意 有n个车站,编号1~n,每个车站有k个出口,车站的出口默认是k个出口中的第一个,如果不想从默认出口出站,则需要手动选择出站 ...
- Bootstrap入门七:按钮
1.可作为按钮使用的标签或元素 为 <a>.<button> 或 <input> 元素添加按钮类(button class)即可使用 Bootstrap 提供的样式 ...