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

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

目录
相关文章
|
16天前
|
机器学习/深度学习 安全 数据挖掘
Swift语言的应用场景非常广泛
Swift语言的应用场景非常广泛
23 4
|
21天前
|
Swift
Swift 自动引用计数(ARC)
Swift 自动引用计数(ARC)
23 1
|
27天前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
49 1
|
2月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
52 5
|
4月前
|
API Swift C语言
探索iOS开发:Swift中的异步编程与GCD应用
【8月更文挑战第4天】在iOS开发的海洋中,掌握Swift语言的航向是至关重要的。本文将引领你深入理解Swift中的异步编程概念,并借助Grand Central Dispatch(GCD)这一强大的工具,来简化并发编程的复杂性。我们将通过实际代码示例,展现如何在iOS应用中高效地管理后台任务和提升用户界面的响应性。
85 3
|
7月前
|
机器学习/深度学习 数据采集 TensorFlow
【Swift开发专栏】Swift与机器学习:构建智能应用
【4月更文挑战第30天】本文探讨了使用Swift开发机器学习应用,分为三个部分:机器学习基础(定义、类型及应用),Swift在机器学习中的作用(Swift for TensorFlow、Core ML及性能优势),以及实践技巧(数据预处理、特征工程、模型训练与部署、性能优化和用户界面集成)。通过学习,开发者能掌握构建智能应用的技能,利用Swift的性能和安全性提升应用效率。随着深入学习,开发者可探索更多高级特性和技术,如深度学习和复杂数据分析。
117 2
|
7月前
|
缓存 Swift UED
【Swift开发专栏】Swift应用的启动优化
【4月更文挑战第30天】本文介绍了Swift应用启动优化技巧,包括优化代码结构和资源加载。建议减少启动时加载的代码,采用延迟加载、分模块加载和懒加载策略;优化初始化代码,注意顺序、异步初始化和避免全局初始化。对于资源,压缩图片、使用矢量图和图片缓存可提升加载速度。文中还提供了实战案例,展示如何在代码中实施这些优化措施。
114 1
|
7月前
|
安全 Swift iOS开发
【Swift 开发专栏】Swift 与 UIKit:构建 iOS 应用界面
【4月更文挑战第30天】本文探讨了Swift和UIKit在构建iOS应用界面的关键技术和实践方法。Swift的简洁语法、类型安全和高效编程模型,加上与UIKit的紧密集成,使开发者能便捷地创建用户界面。UIKit提供视图、控制器、布局、动画和事件处理等功能,支持灵活的界面设计。实践中,遵循设计原则,合理组织视图层次,运用布局和动画,以及实现响应式设计,能提升界面质量和用户体验。文章通过登录、列表和详情界面的实际案例展示了Swift与UIKit的结合应用。
299 1
|
7月前
|
缓存 算法 Swift
【Swift 开发专栏】Swift 应用的性能优化技巧
【4月更文挑战第30天】本文探讨了Swift应用性能优化,强调理解性能瓶颈、针对性优化和平衡性能与代码质量的重要性。提出优化技巧,包括选择合适数据结构、避免不必要的对象创建、使用缓存、优化算法、减少计算、管理内存、利用多核处理、优化网络请求和界面渲染。通过实际案例分析证明了这些方法能有效提升应用性能和用户体验。开发者应持续关注新技术和方法,以适应不断提升的性能要求。
96 1
|
7月前
|
存储 Swift iOS开发
使用Swift开发一个简单的iOS应用的详细步骤。
使用Swift开发iOS应用的步骤包括:创建Xcode项目,设计界面(Storyboard或代码),定义数据模型,实现业务逻辑,连接界面和逻辑,处理数据存储(如Core Data),添加网络请求(必要时),调试与测试,根据测试结果优化改进,最后提交至App Store或其它平台发布。
145 0