创建: 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, 返回nil
 可选链呼出方法

前面有nil时方法不执行, 方法的参数是方法也不执行

a?.b?.c?.getSampleData(data: createData(with: )) // getSampleData(data:)和createData(with:)都不执行
 可选链的型

可选类型T?

a?.b?.c?.name // String?

不用可选链时为T的, 用可选链为T?

 不返回值的方法的情况 

不返回值的方法

// 三个返回的型相同
func sample1(...) {...} // 省略返回的型
func sample2(...) -> () {...} // 返回型 ()
func sample3(...) -> Void {...} // 返回型Void

● 可选链下不返回值的方法的返回型

Void?

作为条件

if a?.b?.c?.method(...) != nil {... }
// 相当于
if let _ = a?.b?.c?.method(...) {...}
 对可选链代入 

● 左侧可选链取值失败则不代入, 右侧式子不会执行

● 左侧可选链取值成功则可以代入

● 除了代入, 复合代入也一样

+=, -=, *=, /=, ...

   
key path
 key path 

可选链那样的参照回路

\型名.路径   // \和型名间可以有空格, 路径可以是可选链或其他属性路径

let keyPath1 = \OptionalChainTestClass.complexData?.data

● 路径内不能带有方法名

● KeyPath的型

KeyPath<起点型, 获取的型>

struct Sample {
var a:Int
} \Sample.a // 型: KeyPath<Sample, Int>
 用key path进行值的操作

● 获取值

实例[keyPath: KeyPath实例]

let keyPath1 = \OptionalChainTestClass.complexData?.data
print(type(of: keyPath1)) // KeyPath<OptionalChainTestClass, Optional<Int>>
print(optionalChainTest[keyPath: keyPath1] ?? "nil") // nil

● 代入

实例[keyPath: KeyPath实例] = 新值
   
   

Swift4 内存管理, 可选链, KeyPath的更多相关文章

  1. Swift中的可选链与内存管理(干货系列)

    干货之前:补充一下可选链(optional chain) class A { var p: B? } class B { var p: C? } class C { func cm() -> S ...

  2. 24小时学通Linux内核之内存管理方式

    昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今天将会讲诉Linux如何追踪和管理用户空间进程的可用内 ...

  3. 十天学Linux内核之第三天---内存管理方式

    原文:十天学Linux内核之第三天---内存管理方式 昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今 ...

  4. 启动期间的内存管理之bootmem_init初始化内存管理–Linux内存管理(十二)

    1. 启动过程中的内存初始化 首先我们来看看start_kernel是如何初始化系统的, start_kerne定义在init/main.c?v=4.7, line 479 其代码很复杂, 我们只截取 ...

  5. 启动期间的内存管理之初始化过程概述----Linux内存管理(九)

    在内存管理的上下文中, 初始化(initialization)可以有多种含义. 在许多CPU上, 必须显式设置适用于Linux内核的内存模型. 例如在x86_32上需要切换到保护模式, 然后内核才能检 ...

  6. [深入理解Java虚拟机]<自动内存管理>

    Overview 走近Java:介绍Java发展史 第二部分:自动内存管理机制 程序员把内存控制的权利交给了Java虚拟机,从而可以在编码时享受自动内存管理.但另一方面一旦出现内存泄漏和溢出等问题,就 ...

  7. 内存管理(1)-buddy和slub算法

    Linux内存管理是一个很复杂的系统,也是linux的精髓之一,网络上讲解这方面的文档也很多,我把这段时间学习内存管理方面的知识记录在这里,涉及的代码太多,也没有太多仔细的去看代码,深入解算法,这篇文 ...

  8. 【原创】xenomai内核解析--实时内存管理--xnheap

    目录 一. xenomai内存池管理 1.xnheap 2. xnpagemap 3. xnbucket 4. xnheap初始化 5. 内存块分配 5.1 小内存分配流程(<= 2*PAGE_ ...

  9. linux内存管理

    一.Linux 进程在内存中的数据结构 一个可执行程序在存储(没有调入内存)时分为代码段,数据段,未初始化数据段三部分:    1) 代码段:存放CPU执行的机器指令.通常代码区是共享的,即其它执行程 ...

随机推荐

  1. 事件和委托: 第 6 页 .Net Framework中的委托与事件

    原文发布时间为:2008-11-01 -- 来源于本人的百度文章 [由搬家工具导入] .Net Framework中的委托与事件 尽管上面的范例很好地完成了我们想要完成的工作,但是我们不仅疑惑:为什么 ...

  2. Swift 入门学习一:简单值

    1.简单值 使用“let”来声明常量,使用“var”来声明变量. 常量,在编译的时候,并不需要有明确的值,但是只能赋值一次.即:可以用常量来表示这样一个值--只需要决定一次,但是需要使用很多次. va ...

  3. HDU 6395 分段矩阵快速幂 HDU 6386 建虚点+dij

    http://acm.hdu.edu.cn/showproblem.php?pid=6395 Sequence Time Limit: 4000/2000 MS (Java/Others)    Me ...

  4. HDU3549 最大流 裸题

    EK算法 时间复杂度o(n*m*m)  因为有反向边每次bfs时间为 n*m 每次删一条边 最多m次 代码 #include<iostream> #include<string.h& ...

  5. 洛谷—— P1462 通往奥格瑞玛的道路

    https://www.luogu.org/problem/show?pid=1462 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主 ...

  6. Java基础教程:tutorialspoint-java

    来自turorialspoint的Java基础教程(英文),官网:https://www.tutorialspoint.com/java/index.htm 这个教程在国内已经被翻译成中文(不过是属于 ...

  7. 【Nginx】如何使用http配置

    处理http配置项可以分为下面4个步骤: 1)创建数据结构用于存储配置项对应的参数 2)设定配置项在nginx.conf中出现时的限制条件与回调方法 3)实现第2步中的回调方法,或者使用Nginx框架 ...

  8. 图解TCP/IP第五版 -- 文件夹

    非常多年前买过<TCP/IP具体解释>3卷,当时可能根本没看,也可能是看了又忘了,没有留下什么印象,当时的书也当做废品卖了. 卖书时的感觉貌似是.买了太多的书,基本都没看,搬家搬来搬去的麻 ...

  9. @Retention n. 保留

    @Retention n. 保留 学习了:https://blog.csdn.net/asdgbc/article/details/70196749 默认都是保留到class中,而在runtime中没 ...

  10. Deepin-添加path

    以管理员权限添加path(Debian系列) sudo gedit /etc/profile 添加path路径格式是: export PATH=”$PATH:your path1:your path2 ...