自动引用计数
swift使用ARC 来跟踪和管理应用程序的内存,会在类的实例不再被使用是对,自动释放其占用的内存。仅仅应用于类的实例。(结构体和枚举类型是值类型,不是引用类型,也不是通过引用的方式存储和传递)
解决实例之间的循环强引用:弱引用和无主引用(当其他的实例有更短的生命周期时,使用弱引用 当其他实例有相同的或更长的生命周期时,使用无主引用)
弱引用不会对其引用的实例保持强引用,因而不会阻止AEC销毁被引用的实例(使用weak关键字)即使引用存在,实例也可能被销毁,ARC会在引用的实例被销毁后自动将其赋值为nil。因为弱引用可以允许它们的值在运行时被赋值为nil,所以它们被定义为可选类型变量,而不是常量(当ARC设置弱引用为nil时,属性观察不会被触发)
无主引用(unowned)通常都被期望着拥有值,不过ARC无法在实例被销毁后将无主引用设为nil,因为非可选类型的变量不允许被赋值为nil。使用无主引用,必须确保引用始终指向一个未销毁的实例。(如果在实例被销毁后,访问该实例的无主引用会触发运行错误)swift还提供了不安全的无主引用,可以通过unowned(unsafe)来声明不安全无主引用
无主引用以及隐式解析可选属性 使用隐式解析可选值意味着满足了类的构造函数的两个构造阶段的要求,属性在在初始化完成后,能像非可选值一样使用和存取,同避免了循环强引用
弱引用适用两个属性的值都允许为nil;
无主引用适用于一个属性的值允许为nil,而另一个属性的值不允许为nil;
无主引用以及隐式解析可选属性适用于两个属性都必须有值
解决闭包引起的循环强引用:在定义闭包时同时定义捕获列表作为闭包的一部分。捕获列表定义了闭包体内捕获一个或多个引用类型的规则,跟解决两个类实例间的循环强引用一样,声明每个捕获的引用为弱引用或无主引用,而不是强引用(只要在闭包内使用self的成员,就要用self.someProperty或self.someMethod())
在被捕获的引用可能会变为nil时,将闭包内的捕获定义为弱引用;在闭包和捕获的实例总是互相引用并且总是同时销毁时,将闭包内的捕获定义为无主引用(如果被捕获的引用绝对不会变为nil时,应该使用无主引用,而不是弱引用)
lazy var someClosure: (Int,String) ->String= {
[unowned self,weak delegate =self.delegate!] (index:Int, stringToProcess:String) ->String in
// 这里是闭包的函数体
}
网友评论