zoukankan      html  css  js  c++  java
  • 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]
     */
  • 相关阅读:
    springboot整合极光推送实现APP通知
    微信服务商AppID账号与商户号配置和查看
    linux-contos7中安装nginx
    centos 7 安装sql server 2017
    Redis集群高可用
    检查预约业务系统交互时序图
    特殊字符检测
    for循环执行原理
    Web.py报错:OSError: No socket could be created -- (('0.0.0.0', 8080):
    Oracle导出数据中的prompt,set feedback 等是什么意思
  • 原文地址:https://www.cnblogs.com/ZhangShengjie/p/14295843.html
Copyright © 2011-2022 走看看