美文网首页
Swift学习- 自动引用计数&&可选链

Swift学习- 自动引用计数&&可选链

作者: 天下林子 | 来源:发表于2018-08-20 10:00 被阅读14次

自动引用计数

工作机制

  • Swift和OC一样,采用自动引用计数来管理内容
    • 当有一个强引用指向某一个动向时,该对象的引用计数会自动+1
    • 当该强引用消失时,引用计数会自动-1
    • 当引用计数为0时,该对象会被销毁

循环引用

  • 在通常情况下,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.当对象销毁时依然指向原来的位置(容易引起野指针)
// 1.创建类
class Student {
    weak var book : Book?
    // unowned var book : 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



//: Playground - noun: a place where people can play

import UIKit


class Person {
    var name : String = ""
    var book: Book?
    
    deinit {
        print("Person ---- deinit")
    }
    
}

class Book {
    var price: Double = 0
    
    /*
     OC 中表示弱引用
     __weak/__unsafe_unretained
     
     swift 中弱引用
     weak/unowned(野指针错误)
     */
    //unowned 不能用于修饰可选类型
    unowned var owner : Person = Person()
    
    //var owner: Person?
    
    deinit {
        print("Book ---- deinit")
    }
    
}

//2. 创建两个对象

var person : Person? = Person()
person!.name = "why"

var book : Book? = Book()
book!.price = 89

person!.book = book
book!.owner = person!

//当将person 和book 都置为nil 时,则person对象和book对象还是没有销毁
//如果要销毁,则要一个改为weak

person = nil
book = nil

image.png image.png

可选链

可选连的概念

  • 它的可选性体现于请求或调用的目标当前可能为空(nil)
    • 如果可选的目标有值,那么调用就会成功;
    • 如果选择的目标为空(nil),则这种调用将返回空(nil)
  • 多次调用被链接在一起形成一个链,如果任何一个节点为空(nil)将导致整个链失效。
  • 可选链的使用
    • 在可选类型后面放一个问号,可以定义一个可选链。
    • 这一点很像在可选值后面放一个叹号来强制拆得其封包内的值
      • 它们的主要的区别在于当可选值为空时可选链即刻失败
      • 然而一般的强制解析将会引发运行时错误。
    • 因为可选链的结果可能为nil,可能有值.因此它的返回值是一个可选类型.
      • 可以通过判断返回是否有值来判断是否调用成功
      • 有值,说明调用成功
      • 为nil,说明调用失败

可选链的示例

  • 从可选链中取值
    • 示例描述: 人(Person)有一个狗(Dog),狗(Dog)有一个玩具(Toy),玩具有价格(price)
    • 使用代码描述上述信息
// 1.定义类
class Person {
    var name : String
    var dog : Dog?

    init(name : String) {
        self.name = name
    }
}

class Dog {
    var color : UIColor
    var toy : Toy?

    init(color : UIColor) {
        self.color = color
    }

    func runing() {
        print("跑起来")
    }
}

class Toy {
    var price : Double = 0.0
}

// 2.创建对象,并且设置对象之间的关系
// 2.1.创建对象
let person = Person(name: "小明")
let dog = Dog(color: UIColor.yellow)
let toy = Toy()
toy.price = 100.0

// 2.2.设置对象之间的关系
person.dog = dog
dog.toy = toy
  • 需求:获取小明的大黄宠物的玩具价格
    • 取出的值为可选类型,因为可选链中有一个可选类型为nil,则返回nil
    • 因此结果可能有值,可能为nil.因此是一个可选类型
let price = person.dog?.toy?.price
print(price) // Optional(100.0)\n
  • 需求:给小明的大黄一个新的玩具
    • 相当于给可选类型赋值
person.dog?.toy = Toy()
  • 需求:让小明的狗跑起来
    • 如果可选类型有值,则会执行该方法
    • 如果可选类型为nil,则该方法不会执行
person.dog?.runing()

自动引用计数

工作机制

  • Swift和OC一样,采用自动引用计数来管理内容
    • 当有一个强引用指向某一个动向时,该对象的引用计数会自动+1
    • 当该强引用消失时,引用计数会自动-1
    • 当引用计数为0时,该对象会被销毁

循环引用

  • 在通常情况下,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.当对象销毁时依然指向原来的位置(容易引起野指针)
// 1.创建类
class Student {
    weak var book : Book?
    // unowned var book : 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学习- 自动引用计数&&可选链

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