自动引用计数

引用类型(类、函数、闭包) 当声明一个变量指向某个引用类型时 当前引用类型的引用计数就会加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?) {

        at = author

    }

 

    deinit {

        print("Video 被销毁了")

    }

}

 

class ViewController: UIViewController {

     var author: Author?

     var video: Video?

    override func viewDidLoad() {

        super.viewDidLoad()

        author = Author(name: "jack")

        video = Video(author: author)

//        author?.video = video

//        author?.video = nil

//        video?.at = nil

//        author = nil

        video = nil

 
        // Do any additional setup after loading the view.     } }
//若上所示 author与video就被销毁了
/*
分析
初始化author author对象的引用计数加+1
video中也传入author 那么当前author 计数为2
如果想让当前的author被释放 那么它的引用计数需都为0
需要将vide中的author 也置位空
若只是单纯的 将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]
*/

最新文章

  1. State(状态)
  2. 熔断器设计模式<转>
  3. bzoj1877: [SDOI2009]晨跑
  4. Codeforces Problem 598E - Chocolate Bar
  5. 从文章"避免复制与粘贴"到文章"Extract Method"的反思(1)
  6. Flume配置
  7. Java学习之Comparable与Comparator的区别
  8. 异常:未能载入文件或程序集”DAL”或它的某一个依赖项——解决的方法
  9. Leetcode题解(八)
  10. SpringBoot使用Sharding-JDBC读写分离
  11. DVWA 黑客攻防演练(二)暴力破解 Brute Froce
  12. 【Spark-SQL学习之二】 SparkSQL DataFrame创建和储存
  13. Day4--Python--列表增删改查,元组,range
  14. read_csv报错Initializing from file failed
  15. 用Canvas做动画
  16. 迷你MVVM框架 avalonjs 学习教程12、数据联动
  17. Java之JVM调优案例分析与实战(4) - 外部命令导致系统缓慢
  18. Python 打包程序
  19. Eclipse下无法解析注解:@Getter和@Setter
  20. django notes 一:开篇

热门文章

  1. Mac 如何用python下载Mac OS
  2. CF1268B题解
  3. Linux网络第五章:yum仓库的灵活部署及NFS共享服务
  4. DOM状态监听(观察者模式)
  5. TreeView控件的基本用法
  6. 使用Telnet伪造邮件发送
  7. HCIP-进阶实验05-Eth-Trunk配置部署
  8. 初学银河麒麟linux笔记 第三章 QT缺少的模块下载、更新软件源操作
  9. LCP 03.机器人大冒险
  10. version libcrypto.so.10 not defined in file libcrypto.so.10 with link time reference