Swift4 内存管理, 可选链, KeyPath
创建: 2018/03/09
完成: 2018/03/09
| 参照型数据与ARC | |
| ARC |
● Swift里, 只有类实例与闭包实例是参照型 ● 生成时参照值为1, 被代入等每次+1, 减少每次-1 ● 为0运行deinit并自动释放 ● 判定实例是否相同 ===/!== ===运算符: 判定是否指向同一个内存位置(类实例, 闭包实例) !==: ===的否定 |
| ARC内存管理 | 用ARC进行内存管理就是ARC内存管理 |
| 强参照循环 | |
| 实例无法释放的情况 |
参照循环, 即多个属性互相参照 解决方案就是下面两条: 弱参照, 非所有参照 |
| 弱参照 |
● 参照时被参照物的参照计数不会增加, 加 weak 必须是var, 因为被参照物被释放时值自动改为nil weak var sample: SampleClass 类实例必须至少有一个强参照, 不然ARC=0, 直接释放 ● 零化, 参照物被释放时值自动改为nil ● 用法: 类内部的类实例属性用weak, 防止循环参照 |
| 非所有参照(unowned reference) |
● 参照时被参照物的参照计数不会增加, 加 unowned ● 和weak一样, 但是不会零化 ● 用法: 参照量不会变nil得情况下用unowned代替weak 类似于T!和T? ● 速度不重要时, 都用weak |
| Xcode去表示参照关系 |
运行项目后, [Debug Memory Graph]按钮 箭头: 被参照物 <-- 参照物 |
| 可选链 | |
| 可选链 |
a?.b?.c? // a, b, c都非nil, 返回a.b.c |
| 可选链呼出方法 |
前面有nil时方法不执行, 方法的参数是方法也不执行 a?.b?.c?.getSampleData(data: createData(with: )) // getSampleData(data:)和createData(with:)都不执行 |
| 可选链的型 |
可选类型T? a?.b?.c?.name // String? 不用可选链时为T的, 用可选链为T? |
| 不返回值的方法的情况 |
不返回值的方法 // 三个返回的型相同 ● 可选链下不返回值的方法的返回型 Void? 作为条件 if a?.b?.c?.method(...) != nil {... }
|
| 对可选链代入 |
● 左侧可选链取值失败则不代入, 右侧式子不会执行 ● 左侧可选链取值成功则可以代入 ● 除了代入, 复合代入也一样 +=, -=, *=, /=, ... |
| key path | |
| key path |
可选链那样的参照回路 \型名.路径 // \和型名间可以有空格, 路径可以是可选链或其他属性路径 例 let keyPath1 = \OptionalChainTestClass.complexData?.data ● 路径内不能带有方法名 ● KeyPath的型 KeyPath<起点型, 获取的型> 例 struct Sample {
|
| 用key path进行值的操作 |
● 获取值 实例[keyPath: KeyPath实例] 例 let keyPath1 = \OptionalChainTestClass.complexData?.data ● 代入 实例[keyPath: KeyPath实例] = 新值 |
Swift4 内存管理, 可选链, KeyPath的更多相关文章
- Swift中的可选链与内存管理(干货系列)
干货之前:补充一下可选链(optional chain) class A { var p: B? } class B { var p: C? } class C { func cm() -> S ...
- 24小时学通Linux内核之内存管理方式
昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今天将会讲诉Linux如何追踪和管理用户空间进程的可用内 ...
- 十天学Linux内核之第三天---内存管理方式
原文:十天学Linux内核之第三天---内存管理方式 昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今 ...
- 启动期间的内存管理之bootmem_init初始化内存管理–Linux内存管理(十二)
1. 启动过程中的内存初始化 首先我们来看看start_kernel是如何初始化系统的, start_kerne定义在init/main.c?v=4.7, line 479 其代码很复杂, 我们只截取 ...
- 启动期间的内存管理之初始化过程概述----Linux内存管理(九)
在内存管理的上下文中, 初始化(initialization)可以有多种含义. 在许多CPU上, 必须显式设置适用于Linux内核的内存模型. 例如在x86_32上需要切换到保护模式, 然后内核才能检 ...
- [深入理解Java虚拟机]<自动内存管理>
Overview 走近Java:介绍Java发展史 第二部分:自动内存管理机制 程序员把内存控制的权利交给了Java虚拟机,从而可以在编码时享受自动内存管理.但另一方面一旦出现内存泄漏和溢出等问题,就 ...
- 内存管理(1)-buddy和slub算法
Linux内存管理是一个很复杂的系统,也是linux的精髓之一,网络上讲解这方面的文档也很多,我把这段时间学习内存管理方面的知识记录在这里,涉及的代码太多,也没有太多仔细的去看代码,深入解算法,这篇文 ...
- 【原创】xenomai内核解析--实时内存管理--xnheap
目录 一. xenomai内存池管理 1.xnheap 2. xnpagemap 3. xnbucket 4. xnheap初始化 5. 内存块分配 5.1 小内存分配流程(<= 2*PAGE_ ...
- linux内存管理
一.Linux 进程在内存中的数据结构 一个可执行程序在存储(没有调入内存)时分为代码段,数据段,未初始化数据段三部分: 1) 代码段:存放CPU执行的机器指令.通常代码区是共享的,即其它执行程 ...
随机推荐
- C++动态特性和C++对象模型——《高质量程序设计12章》
1.动态特性 静态特性和动态特性,编译时和运行时 虚函数 (1)虚函数的叫覆盖,虚函数不是实现多态的唯一手段(其他语言也可能采用别的方法). 抽象基类: (1)如果将基类的虚函数声明为纯虚函数,则基类 ...
- 深入理解计算机操作系统——第10章:UNIX IO,打开,关闭,读写文件
系统级IO:输入输出是主存与外部设备(磁盘,终端,网络)之间拷贝数据的过程 输入:从IO设备拷贝数据到主存中 输出:从主存中拷贝数据到IO设备中 10.1 unix IO 所有的IO设备都被模型化为文 ...
- UITextInputMode currentInputMode is deprecated. 警告的解决
如果你的工程最低支持版本为7.0 你会发现有警告 : 'currentInputMode' is deprecated: first deprecated in iOS 7.0 替换方案:UIText ...
- Spring MVC静态资源实例
以下内容引用自http://wiki.jikexueyuan.com/project/spring/mvc-framework/spring-static-pages-example.html: 例子 ...
- Meteor会话
会话用于当用户在使用应用程序时保存数据.当用户离开应用这些数据将被删除. 在本教程中,我们将学习如何设置会话对象,存储一些数据并返回数据.我们将使用基本的HTML设置. meteorApp/impor ...
- Windows下C/C++连接mysql数据库的方法
步骤 安装MySQL数据库 项目属性页->C/C++->常规->附加包含目录:xxx\mysql Server 5.6\include 项目属性页->链接器->常规-&g ...
- 【深入探索c++对象模型】data语义学二
单一继承中,base class 和derived class的对象都是从相同的地址开始,其间差异只在于derived class比较大,用以容纳自己的nonstatic members. 若vptr ...
- centos编辑界面和图形界面登陆切换设置
输入命令 vi /etc/inittab 到最后一行.把5改成3 保存退出. 各数字的含义: # 0 - halt (Do NOT set initdefault to this) ...
- http协议的相关知识
因为如今的工作设计的Web开发,因此了解了一下Http协议.在阅读了这篇文章HTTP协议具体解释(真的非常经典)后,总结了相关经常使用知识并列在此处以方便以后的查询. HTTP协议的主要特点可概括例如 ...
- 【剑指Offer面试题】 九度OJ1517:链表中倒数第k个结点
鲁棒性是指程序可以推断输入是否符合规范要求,并对不和要求的输入予以 合理的处理. 题目链接地址: http://ac.jobdu.com/problem.php?pid=1517 题目1517:链表中 ...