Swift Basics
- 请说明并比较以下关键词:strong, weak, unowned
Swift 的内存管理机制与 Object-C一样为 ARC(Automatic Reference Counting)。它的基本原理是,一个对象在没有任何强引用指向它时,其占用的内存会被回收。反之,只要有任何一个强引用指向该对象,它就会一直存在内存中。
- strong 代表着强引用,是默认属性。当一个对象被声明为 strong 时,就表示父层级对该对象有一个强引用的指向。此时该对象的引用计数会增加1。
- weak 代表着弱引用。当对象被声明为 weak 时,父层级对此对象没有指向,该对象的引用计数不会增加1。它在对象释放后弱引用也随即消失。继续访问该对象,程序会得到nil,不会崩溃。
- unowned 与弱引用本质上一样。唯一不同的是,对象在释放后,依然有一个无效的引用指向对象,它不是 Optional 也不指向 nil 。如果继续访问该对象,程序就会崩溃。
加分回答:
weak 和 unowned 的引入是为了解决由 strong 带来的循环引用问题。简单来说,就是当两个对象互相有一个强指向去指向对方,这样导致两个对象在内存中无法释放。
weak 和 unowned 的使用场景有如下差别:
- 当访问对象时该对象可能已经被释放了,则用 weak。比如delegate的修饰。
- 当访问对象确定不可能被释放,则用 unowned。比如self的引用。
- 实际上为了安全起见,很多公司规定任何时候都是用weak去修饰。
上一题 | 目录 | 下一题 |
---|
网友评论