Swift_学习笔记_自动引用计数
2017-08-29 16:28
288 查看
Swift使用的自动引用技术
ARC(
Automatic Reference Count)这一机制来跟踪和管理程序的内存使用状况。
Swift的
ARC机制只是对于基于引用计数的对象采有效,对于基于值拷贝的,比如
struct、
enum是无效的。
Swift提供了两种方法解决循环强引用问题:弱引用(
weak reference)和无主引用(
unowned reference)。
对于生命周期内会变为
nil的实例使用弱引用。相反的,对于初始化赋值后再也不会被赋值为
nil的,使用无主引用。
弱引用(
weak)
弱引用必须声明为变量,表明其值在运行时可以被修改。
弱引用不能被声明为常量。
因为弱引用可以没有值,所以必须将每一个弱引用声明为可选类型。
无主引用(
unowned)
无主引用是永远有值的。
无主引用总是被定义为非可选类型。
可以在声明属性或者变量时,在前面加上关键字
unowned,表示这是一个无主引用。
如果试图在实例被销毁后访问该实例的无主引用,会触发运行时错误。使用无主运用,必须确保无主引用始终指向一个未销毁的实例。
如果试图访问实例已经被销毁的无主引用,程序会直接崩溃。而不会发生无法预期的行为。因此,应避免这样的事情发生。
两个类的属性值都允许为
nil,并且会潜在产生循环强引用,适用于
weak。
两个类的其中一个属性值允许为
nil,而另外一个属性的值不允许为
nil,并且会潜在产生循环强引用,适用于
unowned。
如果两个属性值都必须有值,并且初始化之后不能为
nil,在此种情况下,一个属性值需要使用
unowned修饰,另外一个属性值不能为
nil。这时候需要一个属性值用
unowned修饰,另一个属性值使用显示展开的可选属性。
闭包引起的循环强引用
在定义闭包的同时,定义占有列表作为闭包的一部分,用以解决闭包的循环强引用。
占有列表的每个元素都是由
weak和
unowned关键字和实例的引用成对组成。每一对都在花括号中,通过逗号隔开。
占有列表放置在闭包参数列表和返回类型之前,代码示例:
class Clourse{ lazy var someClourse:(Int,String) -> String = { [unowned self] (index:Int,stringToProcess:String) ->String in // 闭包代码 return "wangsk" } }
如果闭包没有指定参数列表或者返回类型,则可以通过上下文盘算,可以将占有列表放在闭包开始的地方,跟着使用关键字:
in。代码示例:
class Clourse2{ lazy var someClourse2:() -> String = { [unowned self] in // 闭包代码 return "wangsk2" } }
相关文章推荐
- Swift学习笔记系列——(15)自动引用计数
- Swift学习笔记16——自动引用计数(Automatic Reference Counting)
- swift学习笔记之自动引用计数
- swift学习笔记之-自动引用计数
- swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之17-内存管理和自动引用计数——黑马 IOS 技术博客
- 初探swift语言的学习笔记六(ARC-自动引用计数,内存管理)
- swift语言的学习笔记六(ARC-自动引用计数,内存管理)
- swift学习-自动引用计数(十六)
- Swift学习之自动引用计数
- 初探swift语言的学习笔记六(ARC-自动引用计数,内存管理)
- 对照Java学习Swift--自动引用计数(Automatic Reference Counting)
- swift语言的学习笔记六(ARC-自动引用计数,内存管理)
- swift学习笔记(七)自己主动引用计数
- 【Objective-C学习笔记】内存管理——ARC自动引用计数
- iOS-学习笔记-内存管理 (1)自动引用计数
- swift 学习- 18 -- 自动引用计数
- ios学习笔记之OC篇(二):引用计数
- swift详解之九---------------自动引用计数、循环引用(这个必须理解,必须看)
- swift学习笔记(14)- 解决循环强引用