Swift专题讲解十六——ARC在Swift中的应用(二)

简介: Swift专题讲解十六——ARC在Swift中的应用

关于弱引用和无主引用,其区别主要是在于:


1.弱引用用于解决Optional值的引起的循环引用。


2.无主引用用于解决非Optional值引起的循环引用。


3.个人以为,弱引用可用下图表示:


image.png


4.无主引用可用如下图表示:


image.png


若将上面的代码修改如下,程序会直接崩溃:


class MyClassFive{

   unowned var cls:MyClassSix

   init(param:MyClassSix){

       cls = param

   }

   deinit{

       print("ClassFive deinit")

   }

}

class MyClassSix{

   var cls:MyClassFive?

   deinit{

       print("ClassSix deinit")

   }

}

var obj6:MyClassSix? = MyClassSix()

var obj5:MyClassFive? = MyClassFive(param: obj6!)

obj6?.cls = obj5

obj6=nil

obj5?.cls

上面所举的例子满足了两种情况,一种是两类实例引用的属性都是Optional值的时候使用weak来解决循环引用,一种是两类实例有一个为非Optional值的时候使用unowned来解决循环引用,然而还有第三种情况,两类实例引用的属性都为非Optional值的时候,可以使用无主引用与隐式拆包结合的方式来解决,这也是无主引用最大的应用之处,示例如下:


class MyClassSeven{

   unowned var cls:MyClassEight

   init(param:MyClassEight){

       cls = param

   }

   deinit{

       print("ClassSeven deinit")

   }

}

class MyClassEight{

   var cls:MyClassSeven!

   init(){

       cls = MyClassSeven(param:self)

   }

   deinit{

       print("ClassEight deinit")

   }

}

var obj7:MyClassEight? = MyClassEight()

obj7=nil

除了在两个类实例间会产生循环引用,在闭包中,也可能出现循环引用,当某个类中包含一个闭包属性,同时这个闭包属性中又使用了类实例,则会产生循环引用,示例如下:


class MyClassNine {

   var name:String = "HS"

   lazy var closure:()->Void = {

       //闭包中使用引用值会使引用+1

       print(self.name)

   }

   deinit{

       print("ClassNine deinit")

   }

}

var obj9:MyClassNine? = MyClassNine()

obj9?.closure()

obj9=nil

//不会打印析构信息

Swift中提供了闭包的捕获列表来对引用类型进行弱引用或者无主引用的转换:


class MyClassNine {

   var name:String = "HS"

   lazy var closure:()->Void = {

       [unowned self]()->Void in

       print(self.name)

   }

   deinit{

       print("ClassNine deinit")

   }

}

var obj9:MyClassNine? = MyClassNine()

obj9?.closure()

obj9=nil

捕获列表以中括号标识,多个捕获参数则使用逗号分隔。

目录
相关文章
|
3月前
|
监控 Swift iOS开发
局域网计算机监控软件中利用Swift构建iOS端的移动监控应用
在局域网计算机监控软件的开发中,构建iOS端的移动监控应用是一项关键任务。本文将介绍如何利用Swift语言实现这一目标,通过多个代码示例展示关键功能的实现。
225 1
|
5月前
|
JavaScript 前端开发 PHP
用swift开发ios移动端app应用初体验
直接跟着 apple 官方的 SwiftUI 教程跑的,写惯了 javascript 奔放的代码,很多语法理解起来还是有点费劲
58 1
|
Swift
Swift实用小册23: ARC自动引用计数机制的使用
在本章中,你将学会ARC自动引用计数机制的使用方法。
150 0
Swift实用小册23: ARC自动引用计数机制的使用
|
编解码 Swift iOS开发
iOS 应用之间的跳转(OC&Swift)
iOS 应用之间的跳转(OC&Swift)
793 0
iOS 应用之间的跳转(OC&Swift)
|
Swift iOS开发
在Xocde12上开发面向低于iOS13的Swift应用
1、创建项目 在Xocde12上我们创建swift项目的时候Interface有两种选择:SwiftUI 和 Storyboard。其中SwiftUI只支持iOS13以上的系统,所以如果需要面向iOS13以下系统则无法使用。那么只能使用Storyboard,LifeCycle使用UIKit App Delegate。但是Xocde12默认为我们创建的项目
402 0
|
Swift iOS开发 开发者
第一个受到关注的Swift应用?“Flappy Swift”分享与简析
距离苹果公司刚刚在WWDC 2014上,发布新一代苹果平台编程语言Swift刚刚过去个11小时,开发者Nate Murray就放出了基于测试版Swift开发的应用——一个重制Flappy Bird的简易原型。
112 0
第一个受到关注的Swift应用?“Flappy Swift”分享与简析
|
Swift iOS开发 开发者
Swift专题讲解十六——ARC在Swift中的应用(一)
Swift专题讲解十六——ARC在Swift中的应用
122 0

相关课程

更多