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) {
        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]
 */
原文地址:https://www.cnblogs.com/ZhangShengjie/p/14295843.html