在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
Swift 是自动管理内存的,这也就是说,我们不再需要操心内存的申请和分配。 当我们通过初始化创建一个对象时,Swift 会替我们管理和分配内存。而释放的原则遵循了自动引用计数 (ARC) 的规则:当一个对象没有引用的时候,其内存将会被自动回收。 这套机制从很大程度上简化了我们的编码,我们只需要保证在合适的时候将引用置空 (比如超过作用域,或者手动设为 但是,所有的自动引用计数机制都有一个从理论上无法绕过的限制,那就是循环引用 (retain cycle) 的情况。
什么是循环引用 假设我们有两个类 class A { let b: B init() { b = B() b.a = self } deinit { println("A deinit") } } class B { var a: A? = nil deinit { println("B deinit") } }
在 因为即使 在 Swift 里防止循环引用 为了防止这种人神共愤的悲剧的发生,我们必须给编译器一点提示,表明我们不希望它们互相持有。一般来说我们习惯希望 "被动" 的一方不要去持有 "主动" 的一方。在这里 b.a 里对 A 的实例的持有是由 A 的方法设定的,我们在之后直接使用的也是 A 的实例,因此认为 b 是被动的一方。可以将上面的 class B { weak var a: A? = nil deinit { println("B deinit") } }
在
weak和unowned 在 Swift 中除了 用通俗的话说,就是 关于两者使用的选择,Apple 给我们的建议是如果能够确定在访问时不会已被释放的话,尽量使用
日常工作中一般使用弱引用的最常见的场景有两个:
其中,最常见的delegate使用时,可参考我这篇文章:
所以,weak使用上是更推荐一点的。
|
请发表评论