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

原创文章,欢迎转载。转载请注明:关东升的博客  php

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

Objective-CMRC内存管理框架

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

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

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

 

来总结一下:设计

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_ 关东升。
关注智捷课堂微信公共平台,了解最新技术文章、图书、教程信息
 

更多精品iOSCocos、移动设计课程请关注智捷课堂官方网站:http://www.zhijieketang.com
智捷课堂论坛网站:http://51work6.com/forum.php

相关文章
相关标签/搜索