创建: 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实例] = 新值
   
   

最新文章

  1. 7. SVM松弛变量
  2. C语言基础(5)-有符号数、无符号数、printf、大小端对齐
  3. hive删除数据
  4. chrome调试文章
  5. Spring-task-timer定时器
  6. redis命令集合
  7. 显示ios设备信息的程序
  8. Top 10 Algorithms for Coding Interview--reference
  9. 配置Apache服务器 数据库mySQL
  10. python手记(26)
  11. Hibernate4 : 持久化你的第一个类
  12. HDU 3903 Trigonometric Function
  13. javascript运行机制详解: 再谈Event Loop(转)
  14. 【Zookeeper】应用场景
  15. 新建.Net Core应用程序后引用项一直黄色感叹号怎么办?
  16. Http协议、Tomcat、servlet
  17. zabbix通过php脚本模拟业务访问redis验证nosql的可用性
  18. 背景图片利用backgrond-posintion属性实现不同形式的分割
  19. Unity3D中播放视频的方法
  20. 【数学/贪心/DP】【CF1088E】 Ehab and a component choosing problem

热门文章

  1. visual svn 搭建
  2. msp430入门编程12
  3. python之-- socket 基础篇
  4. 洛谷—— P2802 回家
  5. loj6173 Samjia和矩阵(后缀数组/后缀自动机)
  6. java多线程编程01---------基本概念
  7. Java描述符(修饰符)的类型
  8. OPENWRT安装Python到U盘
  9. webpack-Dependency Graph(依赖图)
  10. Input系统—ANR原理分析(转)