《从零开始学Swift》学习笔记(Day 61)——Core Foundation框架之内存管理

简介:

Swift原生数据类型、Foundation框架数据类型和Core Foundation框架数据类型之间转换过程中,虽然是大部分是可以零开销桥接,零开销并不意味着内存什么都不用管。Swift类型内存管理是采用ARCFoundation类型和Core Foundation类型内存管理都是采用MRCARCCoreFoundation类型内存管理是基于C语言风格的,它有一个对象所有权的概念 

Objective-CMRC内存管理

Core Foundation的内存管理与Objective-CMRC内存管理密不可分,先介绍一下Objective-CMRC内存管理。

所有Objective-C类都继承NSObject类,每个NSObject对象都有一个内部计数器,这个计数器跟踪对象的引用次数,被称为“引用计数Reference Count,简称RC)。当对象被创建时候,引用计数为1。为了保证对象的存在,可以调用retain方法保持对象,retain方法会使其引用计数加1,如果不需要这个对象可以调用releaseautorelease方法,releaseautorelease方法使其引用计数减1。当对象的引用计数为0的时候,系统运行环境才会释放对象内存。

引用计数示例如图所示,首先在第①步调用者A中创建了一个NSObject对象,这时该对象引用计数为1。在第②步调用者B中想使用这个NSObject对象,于是使用NSObject对象引用,但是为了防止使用过程中NSObject对象被释放,可以调用retain方法使引用计数加1,这时引用计数为2。在第③步调用者A中调用releaseautorelease方法,使引用计数减1,这时引用计数为1。在第④步调用者C中调用releaseautorelease方法,只是获得NSObject对象引用,并没有调用retainreleaseautorelease方法,因此没有引起引用计数的变化。在第⑤步调用者B中调用releaseautorelease方法使引用计数减1,这时引用计数为0。这个时候NSObject对象就内存就可以释放了。 

wKioL1beORLRnZJIAAdMPFPEu3Q495.jpg

来总结一下:

1. 谁创建或拷贝对象,他也一定要负责调用NSObject对象releaseautorelease方法,使引用计数减1,如图中调用者A在第①步,负责创建了NSObject对象,那么调用者A也必须是负责使引用计数减1,见第④步。

2. 谁调用retain方法使引用计数加1,它也一定要负责调用NSObject对象releaseautorelease方法,使引用计数减1,如图中调用者B在第②步,调用者B调用NSObject对象retain方法使引用计数加1,那么调用者B也必须是负责使引用计数减1,见第⑤步。 

对象所有权

    一个对象可以有一个或多个所有者,从所有者的角度看是对这个对象具有了“所有权”,从上图中看,调用者A和调用者B所有者,他们可能是一段程序,可能是一个对象。他们对NSObject对象具有所有权,不再使用时候他们应该负责放弃对象所有权,当对象没有所有者时,引用计数为0,它才可以被释放。

    如上图如果按照对象所有权解释:调用者A创建或拷贝NSObject对象,这时调用者A就具有了NSObject对象的所有权,见第①步。调用者B调用NSObject对象retain方法,就获得了也NSObject对象的所有权,见第②步。调用者A调用NSObject对象release方法,放弃NSObject对象的所有权,见第③步。调用者C只是使用NSObject对象没有获得NSObject对象的所有权,见第④步。调用者B调用NSObject对象release方法,放弃NSObject对象的所有权,见第⑤步,但是调用者B使用这个NSObject对象过程中,由于其他调用者放弃所有权,导致NSObject对象被释放,那么调用者B中程序就会发生运行期错误。



本文转自 tony关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1748666,如需转载请自行联系原作者

相关文章
|
7月前
|
NoSQL 关系型数据库 数据库
Swift 服务器框架对比
Swift 服务器框架对比
116 0
|
5月前
【深入理解计算机系统】int 不是整数 | float 不是实数 | 内存引用错误的例子 | 学习笔记
【深入理解计算机系统】int 不是整数 | float 不是实数 | 内存引用错误的例子 | 学习笔记
36 0
|
7月前
|
机器学习/深度学习 人工智能 物联网
大模型时代,还缺一只雨燕 | SWIFT:魔搭社区轻量级微调推理框架
伴随着大数据的发展和强大的分布式并行计算能力,以预训练+微调的模型开发范式渐渐成为深度学习领域的主流。 2023年各家推出的大模型浩如烟海,如GPT4、Llama、ChatGLM、Baichuan、RWKV、Stable-Diffusion等。这些模型在达到越来越好的效果的同时也需要越来越多的算力资源:全量finetune它们动辄需要几十至上百G显存训练部署,一般的实验室和个人开发者无力承担。
|
9月前
|
存储 缓存 NoSQL
二十一、Linux性能优化实战学习笔记- 如何“快准狠”找到系统内存的问题?
已用内存、剩余内存、共享内存、可用内存、缓存和缓冲区的用量。
95 0
|
9月前
|
存储 缓存 BI
|
9月前
|
存储 缓存 算法
十五、Linux性能优化实战学习笔记 - Linux内存是怎么工作的
内存管理也是操作系统最核心的功能之一。内存主要用来存储系统和应用程序的指令、数据、缓存等
223 1
|
11月前
|
存储 并行计算 测试技术
【CUDA学习笔记】第五篇:内存以及案例解释(附案例代码下载方式)(二)
【CUDA学习笔记】第五篇:内存以及案例解释(附案例代码下载方式)(二)
125 0
【CUDA学习笔记】第五篇:内存以及案例解释(附案例代码下载方式)(二)
|
11月前
|
存储 并行计算 计算机视觉
【CUDA学习笔记】第五篇:内存以及案例解释(附案例代码下载方式)(一)
【CUDA学习笔记】第五篇:内存以及案例解释(附案例代码下载方式)(一)
190 0
|
12月前
【学习笔记之我要C】字符串+内存函数(下)
【学习笔记之我要C】字符串+内存函数(下)
57 0
|
12月前
【学习笔记之我要C】字符串+内存函数(上)
【学习笔记之我要C】字符串+内存函数
37 0