1. 工作机制

  • Swift和OC一样,采用自动引用计数来管理内存

    • 当有一个强引用指向某一个对象时,该对象的引用计数会自动+1
    • 当该强引用消失时,引用计数会自动-1
    • 当引用计数为0时,该对象会被销毁

2. 循环引用

  • 在通常情况下,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.当对象销毁时依然指向原来的内存地址(注意:非常危险,很容易产生野指针错误/访问了僵尸对象)
      • unowned : __unsafe_unretained,该修饰不能指向nil
// 1.定义两个类
class Student {
var book : Book? deinit {
print("Student --- deinit")
}
} /*
weak : __weak
unowned : __unsafe_unretained,该修饰不能指向nil
*/ class Book {
// weak var owner : Student?
// unowned : __unsafe_unretained,该修饰不能指向nil,
// 因此这里必须先初始化, 也就要先创建一个对象, 因此输出结果会多销毁一个 student 对象 // owner 是弱引用, 因此在 book 创建完成时就马上被销毁
unowned var owner : Student = Student() deinit {
print("Book --- deinit")
}
} // 2.创建两个对象
var stu : Student? = Student()
var book : Book? = Book()
// Book 中的 owner 属性, 在 book 创建完成时, 就马上被销毁,
// 但是如果 unowned 修饰, 释放后再次访问时, 访问的就是僵尸对象, 野指针错误
// 如果是 weak 修饰, 释放后再次访问时, 访问的是 nil , 不会报错 // 3.让两个对象之间产生关系
stu!.book = book
book!.owner = stu! // 4.让对象销毁
book = nil
stu = nil
// 使用 weak 修饰输出结果
// Student --- deinit
// Book --- deinit
// 使用 unowned 修饰输出结果
// Student --- deinit // 这个打印是 book 创建时马上销毁的弱引用对象
// Student --- deinit
// Book --- deinit

Swift基础语法-内存管理, 自动引用计数的更多相关文章

  1. iOS的内存管理和引用计数规则、Block的用法以及三种形式(stack、malloc、global)

    学习内容 iOS的内存管理和引用计数规则 内存管理的思考方式 自己生成的对象自己持有 非自己生成的对象自己也能持有 自己持有的对象不需要时释放 非自己持有的对象不能释放 ARC有效时,id类型和对象类 ...

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

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

  3. Objective-C内存管理之-引用计数

    本文会继续深入学习OC内存管理,内容主要参考iOS高级编程,Objective-C基础教程,疯狂iOS讲义,是我学习内存管理的笔记 内存管理 1 内存管理的基本概念 1.1 Objective-C中的 ...

  4. Python内存管理及引用计数

    作为一门动态语言,python很重要的一个概念就是动态类型,即对象的类型和内存占用都是运行时确定的.(Why?)运行时,解释器会根据语法和右操作数来决定新对象的类型.动态类型的实现,是通过引用和对象的 ...

  5. 2-Python基础语法-内存管理-运算符-程序控制

    目录 1 Python 基础语法 1.1 注释 1.2 缩进 1.3 续行 1.4 标识符 1.5 转义序列 1.6 数字 1.7 字符串 1.8 其他 2 Python 运算符 2.1 赋值运算符 ...

  6. Objective-C内存管理之引用计数

    初学者在学习Objective-c的时候,很容易在内存管理这一部分陷入混乱状态,很大一部分原因是没有弄清楚引用计数的原理,搞不明白对象的引用数量,这样就当然无法彻底释放对象的内存了,苹果官方文档在内存 ...

  7. iOS项目转移到自动引用计数

    这里主要参考了Apple官方文档:Transitioning to ARC Release Notes 在支持iOS5的Xcode4中,创建项目会看到这样的选项: 这是iOS5的新特性,自动对象引用计 ...

  8. OC基础15:内存管理和自动引用计数

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.什么是ARC? (1).ARC全名为A ...

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

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

随机推荐

  1. Javascript 知识点简介

    如何在HTML中引入JS? 所有重定向的HTML标签内都可以嵌入javascript代码. 浮点数不要用 == 来进行判断 var num=0;    for(var i=0;i<10;i++) ...

  2. [转] Envelop

    xiaohaidepoli原文Envelop Envelope也称包络线,是一个矩形区域,是每个几何形体的最小外接矩形.每个Geometry都拥有一个Envelope,包括Envelope自身. 它定 ...

  3. OWASP Top 10 – 2013, 最新十大安全隐患(ASP.NET解决方法)

    OWASP(开放Web软体安全项目- Open Web Application Security Project)是一个开放社群.非营利性组织,目前全球有130个分会近万名会员,其主要目标是研议协助解 ...

  4. 设计模式_Strategy_策略模式

    形象例子: 跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,单目的都是为了得到MM的芳心,我的追MM锦囊中有好多Strategy哦.策略模式: 策 ...

  5. GIS中相交的定义(OGC相交的定义)

    我们常用GIS中的相交,比如在地图漫游的时候,屏幕显示的图形和屏幕这个包络线就是相交的关系.我们常用的GIS工具,拉框查询,这个用到的也是相交. 首先题目开起来很简单(开始的时候我是这样想的),但是做 ...

  6. js,css压缩工具

    常见的js压缩工具: js commpress: 运行平台:windows系统, 优点:能自动压缩: 缺点:不能拖动文件压缩:只支持windows平台: s.press 运行平台:mac ox系统 优 ...

  7. 【译】 AWK教程指南 附录E-正则表达式

    为什么要使用正则表达式 UNIX 中提供了许多 指令 和 tools,它们具有在文件中 查找(Search)字串或替换(Replace)字串 的功能.像 grep, vi , sed, awk,... ...

  8. 分享两个模拟get和post方法的工具类,让应用能够与服务器进行数据交互

    很久没有码字了,今天跟大家分享一个模拟get和post方法的工具类,在安卓应用中很多都需要跟服务器进行数据交互,这需要两方面的配合,首先服务器端会给应用提供一些数据交互的接口,可是怎样在应用中去调用呢 ...

  9. 50道经典的JAVA编程题 (11-15)

    50道经典的JAVA编程题 (11-15),新年的第一天,继续啦...\(^o^)/~,这50道题都跨年了啊...哈哈 [程序11] TestTN.java 题目:有1.2.3.4个数字,能组成多少个 ...

  10. Hadoop,HBase,Zookeeper源码编译并导入eclipse

    基本理念:尽可能的参考官方英文文档 Hadoop:  http://wiki.apache.org/hadoop/FrontPage HBase:  http://hbase.apache.org/b ...