自动引用计数
引用类型(类、函数、闭包) 当声明一个变量指向某个引用类型时 当前引用类型的引用计数就会加1 当变量不指向该类型时 引用类型就会 -1
当引用计数为0时 当前引用类型就会被系统回收
import UIKit class Author{ var name:String var video:Video? init(name:String) { self.name = name } deinit { print("Author 被销毁了") } } class Video{ var at:Author? init(author:Author) { self.at = author } deinit { print("Video 被销毁了") } } var author:Author? = Author(name: "jack") var video:Video? = Video(author: author!) author?.video = video author?.video = nil video?.at = nil author = nil video = nil //若上所示 author与video就被销毁了 /* 分析 初始化author author对象的引用计数加+1 初始化author video 对象的引用计数加+1 video中的接受了传入的author对象 指向了video中的变量at 那么author对象的引用计数再+1 给author对象传入video 那么author中有一个变量指向了video 那么video引用计数再+1 那么当前author和video 的引用计数都为2 如果想让当前的author和video 都被释放 那么它们的引用计数需都为0 只有如上操作才能使其为0 若只是单纯的 将author = nil 与video = nil 当前对象依然被其他其他对象的变量指向着 所以便不能被释放 */
弱引用于无主引用
import UIKit class Author{ var name:String weak var video:Video? init(name:String) { self.name = name } deinit { print("Author 被销毁了") } } class Video{ unowned var at:Author init(author:Author) { self.at = author } deinit { print("Video 被销毁了") } } var author:Author? = Author(name: "jack") var video:Video? = Video(author: author!) author?.video = video author = nil video = nil /* 默认创建的对象都是强引用类型 适用于自动引用计数 如果不想适用于自动引用计数 那么创建的变量就需要被unowned 和 weak 修饰 unowned 无主人引用 适用于非可选形 weak 弱引用 适用于可选项 */
若将其中一个对象的属性声明去掉weak或 unowned
执行author = nil video = nil 该两个对象依然会被释放 、
这种情况其实和代理声明为啥用weak一样
import UIKit class Author{ var name:String var video:Video? init(name:String) { self.name = name } deinit { print("Author 被销毁了") } } class Video{ unowned var at:Author init(author:Author) { self.at = author } deinit { print("Video 被销毁了") } } var author:Author? = Author(name: "jack") var video:Video? = Video(author: author!) author?.video = video author = nil video = nil
/* 当一个闭包作为一个函数的参数,并且是非逃逸闭包时 在闭包中使用当前对象的属性 不需要加self 其他情况均需要加self */ class person{ var name:String = "" var age:Int = 0 init(name:String,age:Int) { self.name = name self.age = age } lazy var info:() -> String = {[unowned self] () -> String in return "我的名字叫(self.name),年纪(self.age)了" } deinit { print("pseson释放") } } var p:person? = person(name: "jack", age: 18) print(p!.info()) p = nil // 打印 //我的名字叫jack,年纪18了 //pseson释放 /* 由于info 闭包捕获了当前对象 要对当前对象进行弱引用 需要在闭包中说明对当前对象进行弱 及在闭包最前面 申明弱引用 [unowned self] */