ARC(Automatic Reference Counting)自动引用计数 unowned、weak 使用区别

自动引用计数  

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

 

posted @ 2021-01-18 23:44  ZhangShengjie  阅读(114)  评论(0编辑  收藏  举报