Swift基础语法-自动引用计数, 内存管理

作者: DwightChan | 来源:发表于2016-08-01 11:06 被阅读190次

知识点

  1. 工作机制
  2. 循环引用

1. 工作机制

  • Swift内存管理和OC一样: 管理引用类型的内存, 不会管理值类型, 值类型不需要管理
    • 采用自动引用计数来管理内存, 默认情况下所有的引用都是强引用
    • 当有一个强引用指向某一个对象时,该对象的引用计数会自动+1
    • 当该强引用消失时,引用计数会自动-1
    • 当没有任何强引用指向对象, 系统会自动销毁对象

2. 循环引用

  • 在通常情况下,ARC是会自动帮助我们管理内存的
  • 但是在开发中我们经常会出现循环引用的问题,比如下面的示例
    • Student对Book对象有一个强引用
    • 而Book对Student有一个强引用
    • 在两个对象都指向nil时,依然不会被销毁,就形成了循环引用
// 1.创建类
class Student {
    var book : Book?  // 对象属性用可选类型
    deinit {
        print("Student -- deinit")
    }
}

class Book {
    var owner : Student?
    deinit {
        print("Book -- deinit")
    }
}

// 2.创建对象
var stu : Student? = Student()
var book : Book? = Book()

// 3.相互引用
stu?.book = book
book?.owner = stu

// 4.对象置nil
stu = nil
book = nil
  • 解决方案
    • swift提供了两种解决方案
      • weak : 和OC中的__weak一样是一个弱引用.当指向的对象销毁时,会自动将指针指向nil
      • unowned : 和OC中的__unsafe_unretained.当对象销毁时依然指向原来的内存地址(注意:非常危险,很容易产生野指针错误/访问了僵尸对象)
      • unowned : __unsafe_unretained,该修饰不能指向nil
// 1.定义两个类
class Student {
    var book : Book?
    
    deinit {
        print("Student --- deinit")
    }
}

/*
 weak : __weak
 unowned : __unsafe_unretained,该修饰不能指向nil
*/

class Book {
//     weak var owner : Student?
    // unowned : __unsafe_unretained,该修饰不能指向nil, 
    // 因此这里必须先初始化, 也就要先创建一个对象, 因此输出结果会多销毁一个 student 对象

    // owner 是弱引用, 因此在 book 创建完成时就马上被销毁
    unowned var owner : Student = Student()
    
    deinit {
        print("Book --- deinit")
    }
}

// 2.创建两个对象
var stu : Student? = Student()
var book : Book? = Book()
// Book 中的 owner 属性, 在 book 创建完成时, 就马上被销毁,
// 但是如果 unowned 修饰, 释放后再次访问时, 访问的就是僵尸对象, 野指针错误
// 如果是 weak 修饰, 释放后再次访问时, 访问的是 nil , 不会报错

// 3.让两个对象之间产生关系
stu!.book = book
book!.owner = stu!

// 4.让对象销毁
book = nil
stu = nil
// 使用 weak 修饰输出结果
// Student --- deinit
// Book --- deinit
// 使用 unowned 修饰输出结果
// Student --- deinit  // 这个打印是 book 创建时马上销毁的弱引用对象  
// Student --- deinit
// Book --- deinit

相关文章

  • Swift:基础(二十七)自动引用计数

    Swift 自动引用计数(ARC) Swift 使用自动引用计数(ARC)这一机制来跟踪和管理应用程序的内存 通常...

  • Swift基础10

    自动引用计数 swift使用自动引用计数(ARC)机制来跟踪和管理你的应用程序的内存。通常情况下,Swift内存管...

  • Swift : 内存泄露原因及解决办法

    Swift 自动引用计数(ARC) 在Swift中 使用自动引用计数(ARC)这一机制来跟踪和管理应用程序的内存 ...

  • 每天学一点Swift----面向对象下(十)

    十九. Swift内存管理 1. Swift提供了强大的内存管理机制:Swift通过自动引用计数(ARC)可以很好...

  • 引用计数

    自动引用计数 Swift 使用自动引用计数(ARC)机制来跟踪和管理你的应用程序的内存 自动引用计数的工作机制 每...

  • Swift语法(五)

    一.自动引用计数 1.自动引用计数工作机制 1.1 swift和oc一样,采用自动引用计数来管理内存 1.2 当有...

  • swift内存管理

    Swift使用自动引用计数(ARC)机制来处理内存。通常情况下,Swift内存管理机制会自动管理内存,无须我们考虑...

  • Swift使用自动引用计数

    Swift使用自动引用计数(ARC)机制来处理内存。通常情况下,Swift内存管理机制会自动管理内存,无须我们考虑...

  • Obj-C高级编程--内存管理

    自动引用计数 自动引用计数:指内存管理中对引用采取自动计数的技术。 内存管理/引用计数 持有对象引起引用计数加...

  • Swift3.0-自动引用计数

    自动引用计数 Swift 使用自动引用计数(ARC)机制来跟踪和管理你的应用程序的内存。通常情况下,Swift 内...

网友评论

    本文标题:Swift基础语法-自动引用计数, 内存管理

    本文链接:https://www.haomeiwen.com/subject/lmuxsttx.html