Swift首页投稿(暂停使用,暂停投稿)iOS Developer

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

2016-08-01  本文已影响190人  DwightChan

知识点

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

1. 工作机制


2. 循环引用

// 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
// 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

上一篇下一篇

猜你喜欢

热点阅读