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 @   ZhangShengjie  阅读(119)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示