Swift的unowned字段
2016-05-05 11:05
337 查看
unowned简单的说就是防止循环引用,类似OC中的unsafe_unretained字段。最常用的情况是在懒加载模式使用闭包的时候防止循环引用,如果当前的实例直接或者间接地对这个闭包又有引用的话,就形成了一个
self -> 闭包 -> self 的循环引用。
举例
class
Person
{
let
name:
String
lazy
var
printName:
()->()
=
{
print("The
name is \(self.name)")
}
init(personName:
String)
{
name
=
personName
}
deinit {
print("Person
deinit \(self.name)")
}}
var
xiaoMing:
Person?
=
Person(personName:
"XiaoMing")
xiaoMing!.printName()
xiaoMing
=
nil//
输出://
The name is XiaoMing,没有被释放
printName是
self的属性,会被
self持有,而它本身又在闭包内持有
self,
这导致了
xiaoMing的
deinit在自身超过作用域后还是没有被调用,也就是没有被释放。
为了解决这种闭包内的循环引用,我们需要在闭包开始的时候添加一个标注,
来表示这个闭包内的某些要素应该以何种特定的方式来使用。可以将
printName修改为这样:
lazy
var
printName:
()->()
=
{
[unowned
self]
in
print("The
name is \(self.name)")
}
swift还有一种防止对象持有的解决方法是把需要释放的对象用weak修饰,
weak的成员将会自动地变成
nil(因此被标记为
@
weak的变量一定需要是
Optional 值)
关于两者使用的选择,Apple
给我们的建议是如果能够确定在访问时不会已被释放的话,尽量使用
unowned,如果存在被释放的可能,那就选择用
weak。
相关文章推荐
- Swift-控制流
- Swift下的Lazy懒加载模式
- Swift学习笔记二:常用类型的注意事项
- Swift学习笔记一:语言特性
- swift设置返回按钮图标
- 1.swift_初体验
- 对照Java学习Swift--下标(Subscripts)
- Swift中的分类
- Swift中TextField
- Swift解读专题一——Swift2.2语言预览
- Swift 仿简书、淘宝App的弹出view效果
- swift 基本语法(二)
- Swift开发:Swift项目调用OC代码
- swift闭包
- IOS8中SWIFT 弹出框的显示
- Swift 中 10 个震惊小伙伴的单行代码
- Swift2.x编写NavigationController动态缩放titleView
- Swift 中的内存管理详解
- NSHelper.showAlertTitle的两种用法 swift
- Swift开发:NSLayoutConstraint纯代码实现自动布局-初级篇