swift基础之自动引用计数

自动引用计数

分为:

自动引用计数概念

引用计数策略

如何解决循环引用

闭包的循环引用


使用的到的关键字

weak   弱引用 不会影响引用计数,一般时 optional

unowned  无主引用 不会影响引用计数,一般时 非optional


概念:

在swift中 自动引用计数是实例的被引用次数保存起来,当被引用次数变为零的时候,就将其释放的过程。

自动引用计数可以实现自动资源管理的目的


引用计数策略:

1、强引用 (strong reference) ,引用时会导致引用计数 +1 ,失去引用时会使引用计数 -1

2、弱引用 (weak reference)    不会影响引用计数,一般时 optional

3、无主引用 (unowend reference)  不会影响引用计数,一般时 非optional


example:

class Dog {

    var name:String

    //构造器 初始化

    init(name:String){

        self.name = name

        print("dog \(name) is init")

    }

    //析构器 释放

    deinit{

        print("dog \(name) is denint")

    }

}

引用计数

var dog1 : Dog?

var dog2 : Dog?

var dog3 : Dog?

dog1 = Dog(name:"淘气")   //引用计数为1

dog2 = dog1             //引用计数为2

dog3 = dog1             //引用计数为3

输出    

dog 淘气 is init          现在dog 的引用计数为3


取消引用计数

dog1 = nil      //引用计数为2

dog2 = nil      //引用计数为1

print("ready nil dog3")

dog3 = nil      //引用计数为调用了析构器

 输出

 dog 淘气 is init

 ready nil dog3

 dog 淘气 is denint

 表示 dog1,dog2 = nil 后 ,dog3 = nil ,实例才被释放。


解决循环应用

自动引用计数会跟踪我们所创建的一个实例的引用数量,当引用计数为0的时候销毁它,

但是有一种情况使引用计数永远不能为0 ----------> 循环的强引用


循环的强引用:

两个实例相互持有对方的强引用,每个实例都会让对方一直存在。因为这2个实例永远不会释放,占有的资源永远不会释放掉,就导致了 — 内存泄露


解决循环引用的方法:

1、使用弱引用  关键字  weak 在引用对方类的时候 在 前面 加weak

2、使用无主引用 关键字 unowend 使用无主引用 注意,类型不能是optional,一定要赋值


example:

class DogName {

    var name:String

    //持有另一个类

    var dogHouse : DogHouse?

    init(name:String){

        self.name = name

        print("dogName \(name) is init")

    }

    deinit{

        print("dogName \(name) is deinit")

    }

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章