swift 学习之自动引用计数

  • 学习和研究的主要是“实例对象和实例对象直接的相会强引用所产生的内从泄漏”和“使用闭包产生的强引用造成的内存泄漏”

注意:只有以引用类型存储或者传递的才会存在自动引用计数,比如类,闭包,而枚举、结构体等这都是值存储,值传递不存在引用计数问题(其实也就是Object-c中我们熟悉的ARC,和他的原理是一样的)

  • 实例对象和实例对象之间的相互引用造成的内存泄漏

1>产生原因 
两个类中都有对方类的实例变量作为自己的属性,举个例子:创建一个Person类和一个Clazz类

Class Person {
var clazz:Clazz?
}
Class Clazz {
var person:Person?
}
// 创建两个对象,并且赋值给对方就会造成循环引用
let jason = Person()
let class1_1 = Clazz()
jason.clazz = class1_1
class1_1.person = jason

上面的例子,就是一个循环引用的例子,jason->Person<->class1_1->Clazz . 
2> 那么该怎么解决这个问题呢 
在Objective-C中我们知道解决这种类与类之间的强引用,就是声明属性的时候一个用强引用一个用弱引用,那么在swift中是如何解决这种问题的呢? 
swift 提供了两种方式:弱引用(weak修饰)和无主引用(unowned修饰) 
使用法则:弱引用在生命周期内有可能变成nil使用,一旦申明就不会变成nil用无主引用 。 
事实上规则还是和objective-C的规则一样,遇到这种情况也是一个用强引用一个用弱引用或者无主引用。 
注意:存在一种特殊的情况,那就是这两个类各自持有的对方实例对象都必须有值,那么这种情况就需要一个用无主引用,一个用隐式展开可选属性

  • 闭包循环引用造成的内存泄漏

1>造成原因:这是一种闭包和类之间的引用造成的。具体原因就是:一个类将闭包作为自己的属性,然后在类中给闭包赋值,在闭包中又引用了自身,造成循环引用,内存泄漏 
2>解决问题的办法 
在objective-C中我们解决的办法就是重新声明类实例为__weak/__block,两个修饰词的区别是__weak只能修饰对象,而__block可以修饰对象和普通变量(需要在block里修改的变量) 
而在swift中出现了一个新的概念:占有列表,在swift就是通过定义占有列表来解决闭包的循环引用的 
占有列表:占有列表中的每个元素都是由weak或者unowned关键字和实例的引用组成的。
那么什么时候用weak:当占有的引用有时可能为nil的时候 
unwoned:当占有的引用和闭包总是会同时销毁时

swift 学习之自动引用计数的更多相关文章

  1. swift 学习- 18 -- 自动引用计数

    // Swift 使用 自动引用计数 (ARC) 机制来跟踪和管理你的应用程序的内存, 通常情况下, Swift 内存管理机制会一直起作用, 你无须自己来考虑内存的管理, ARC 会在类的实例不再被使 ...

  2. swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  3. swift学习笔记之-自动引用计数

    //自动引用计数 import UIKit /*自动引用计数(Automatic Reference Counting) 防止循环强引用 Swift 使用自动引用计数(ARC)机制来跟踪和管理你的应用 ...

  4. swift:自动引用计数ARC

    Swift自动引用计数:ARC    原文链接:https://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/chapte ...

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

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

  6. swift详解之九---------------自动引用计数、循环引用

    自动引用计数.循环引用(这个必须理解,必须看) 注:本文详细介绍自动引用计数,以及各种循环引用问题.一网打尽! 1. 自动引用计数原理 Swift 使用ARC机制来跟踪和管理你的内存,一般情况下,Sw ...

  7. Swift 自动引用计数(ARC)

    Swift 使用自动引用计数(ARC)这一机制来跟踪和管理应用程序的内存 通常情况下我们不需要去手动释放内存,因为 ARC 会在类的实例不再被使用时,自动释放其占用的内存. 但在有些时候我们还是需要在 ...

  8. Swift ARC 自动引用计数

    1.ARC 引用类型在堆上的内存分配过程中有 8 字节的地址长度用来保存对象的引用计数,堆上的内存并不像栈上那样立即进行回收,系统会定时对堆上的内存进行检查,当某个实例不再被使用时,引用计数会变为 0 ...

  9. Swift5 语言指南(二十五) 自动引用计数(ARC)

    Swift使用自动引用计数(ARC)来跟踪和管理应用程序的内存使用情况.在大多数情况下,这意味着内存管理在Swift中“正常工作”,您不需要自己考虑内存管理.当不再需要这些实例时,ARC会自动释放类实 ...

随机推荐

  1. android activity传递实体类对象

    通过实现Parcelable接口序列化对象的步骤: 1.实现Parcelable接口.2.并且实现Parcelable接口的public void writeToParcel(Parcel dest, ...

  2. css盒子居中定位问题

    在HTML中,div盒子的居中要通过外边距margin和width来控制,首先确定盒子的宽度,然后确定盒子方位并将其平移便可使盒子移到固定位置. <div id="divpic&quo ...

  3. Java中的try catch finaly先后调用顺序

    自我总结,有什么不足或好的方案,希望大家给予纠正,感激不尽! 目的:try catch finaly的顺序执行,和大家复习一遍. 方法:debug来确认执行顺序.(需要引入junit包) 废话不多说, ...

  4. scanf后面跟一个getchar

    scanf(“%d",&a): if(getchar() != '\n') printf();else printf(); 这种情况下,我有点迷惑,就做了个实验,结论是: 1.当输完 ...

  5. DVWA安装问题(phpStudy)

    安装过程出现的问题: 1.PHP function allow_url_include disabled 注意DVWA的版本    PHP version: 5.4.45 打开/phpStudy/ph ...

  6. html5的video标签自动播放

    概念澄清 这里的"自动播放",是指用户的视觉效果,并不一定是元素自身的自动播放. 查看相关文档后,有以下两种最简方案. 配置属性 发现有video标签有一个自动播放的属性autop ...

  7. 浅谈python的对象的三大特性之封装

    我们家里都有电视机,从开机,浏览节目,换台到关机,我们不需要知道电视机里面的具体细节,只需要在用的时候按下遥控器就可以完成操作,这就是功能的封装. 在用支付宝进行付款的时候,只需要在用的时候把二唯码给 ...

  8. Go笔记-继承

    [Go中继承的实现]     当一个匿名类型被内嵌在结构体中时,匿名类型的可见方法也同样被内嵌,这在效果上等同于外层类型 继承 了这些方法:将父类型放在子类型中来实现亚型 package main i ...

  9. Codeforces Round #410 (Div. 2)

    Codeforces Round #410 (Div. 2) A B略..A没判本来就是回文WA了一次gg C.Mike and gcd problem 题意:一个序列每次可以把\(a_i, a_{i ...

  10. 2017人生总结(MECE分析法)

    试着用MECE分析法对人生的整个规划做一下总结.作为技术人员,其实除了编码架构能力之外,分析问题的能力的重要程度也会随着职业发展越来越重要.<美团点评技术博客>说这几天要在黄金时段头版头条 ...