• Swift 内存管理


    1、Object-C 经历两个阶段: 1、手动引用计数内存管理(Manual Reference Counting,MRC) 2、自动引用计数内存管理(Automatic Refernce Counting,ARC)

    2、引用类型 内存分配到 堆 上,需要人为管理。 值类型 内存分配到 栈 上,有处理器管理。

    3、每个类创建的对象都有一个内部计数器,这个计数器跟踪对象的引用次数,成为 引用计数(Reference Count,简称 RC)。当对象被创建时候,引用计数为1,每次对象被引用的时候会是其引用计数加1,如果不需要的时候,对象引用断开(赋值 nil),其中引用计数 减1.当对象引用计数为 0 的时候,对象内存才被释放。

      备注:init(){}  类的构造方法中 会将实例与对象建立"强引用" 关系, deinit{} 析构方法 只有当引用计数为 0 时候才会执行。

    4、强引用循环:

      当两个对象的存储属性相互引用对方的时候,一个对象释放的前提是对方先释放,另一个对象释放前提也是对象先释放,这样就会导致"死锁"的状态,导致内存泄露。

    解决强循环 两种方式:1、弱引用 2、无主引用。

      弱引用:允许其中一个对象不采用强引用类型方式引用另外一个对象,这样就不会引起强引用循环问题。弱引用适合与 引用对象可以没有值的情况,因为弱引用可以没有值,我们必须讲一个弱引用 声明为可选类型,使用weak 声明弱引用。

      例如:员工A类 存储属性 部门, 部门B类  部门领导(员工), 如果部门可以没有 部门领导,那么可以将 B类 部门领导 属性 使用 weak 修饰, 那么A、B 之间不存在循环引用。

      无主引用:其中一个对象不采用强引用另外一个对象。无主引用适用于引用对象永远有值情况,它总是被定义为非可选类型,使用关键字unowned。

      例如:一个员工可以没有部门,一个部门必须有部门领导,那么可以将B类  unowned var manager :Employee ,建立无主引用。

    5、lazy 修饰表示 延迟加载。 lazy var fullName:()->String={ return a+b} ,类的属性 可以在闭包中使用,必须使用 lazy 延迟加载,及所有属性初始化后,self表示对象才会被创建和使用。

    6、闭包引用循环: 如果闭包与捕获对象总是相互引用并且总是同时销毁,则将闭包内的捕获声明为无主引用。

               当捕获的对象有可能为nil时,则将闭包内的捕获声明为 弱引用。如果捕获的对象绝对不会为nil,那么采用无业引用。

  • 相关阅读:
    登陆中发现css页面不见了,变成了光秃秃的输入框问题
    servlet基础一
    解决问题:Error:(5, 59) java: 程序包javax.servlet.http不存在
    静态方法的引用
    登录功能之添加验证码(包含切换验证码)
    生成图片验证码(VerifyCode)
    idea编辑器中批量完成注释及批量取消注释
    jdbc连接测试
    利用IO流复制图片
    js 判空
  • 原文地址:https://www.cnblogs.com/pengzhaov/p/4433288.html
Copyright © 2020-2023  润新知