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

内存托管对象

Swift中调用Core Foundation函数获得对象时候,对象分为:内存托管对象和内存非托管对象。

内存托管对象就是由编译器帮助管理内存,我们不需要调用CFRetain函数获得对象所有权,也不需要调用CFRelease函数放弃对象所有权。

获得这些内存托管对象的方法,是采用了CF_RETURNS_RETAINED或CF_RETURNS_NOT_RETAINED注释声明,示例代码:

-(CGPathRef)makeToPath CF_RETURNS_RETAINED

{

    UIBezierPath* triangle = [UIBezierPath bezierPath];

    [triangle moveToPoint:CGPointZero];

    [triangle addLineToPoint:CGPointMake(self.view.frame.size.width,0)];

    [triangle addLineToPoint:CGPointMake(0, self.view.frame.size.height)];

    [triangle closePath];

    CGPathRef theCGPath = [triangle CGPath];

    return CGPathCreateCopy(theCGPath);

}

内存托管对象使用起来比较简单,不需要我们做额外的事情。

func CFStringCreateWithCString(_ alloc: CFAllocator!,

        _ cStr: UnsafePointer<Int8>,

         _ encoding: CFStringEncoding) -> CFString!  //内存托管对象

func CFHostCreateCopy(_ alloc: CFAllocator?,

         _ host: CFHost) -> Unmanaged<CFHost>    //内存非托管对象

内存非托管对象

内存非托管对象就是内存需要程序员自己管理。这是由于在获得对象的方法中没有使用CF_RETURNS_RETAINED或CF_RETURNS_NOT_RETAINED注释声明,编译器无法帮助管理内存。在具体使用时候我们可以上一节的方法判断是否为非内存托管对象。

内存非托管对象使用起来有些麻烦,要根据获得所有权方法,进行相应的处理。

1. 如果一个函数名中包含Create或Copy,则调用者获得这个对象的同时也获得对象所有权,返回值Unmanaged<T>需要调用takeRetainedValue()方法获得对象。调用者不再使用对象时候,Swift代码中需要调用CFRelease函数放弃对象所有权,这是因为Swift是ARC内存管理的。

2. 如果一个函数名中包含Get,则调用者获得这个对象的同时不会获得对象所有权,返回值Unmanaged<T>需要调用takeUnretainedValue()方法获得对象。

示例代码如下:

let host: CFHost = CFHostCreateWithName(kCFAllocatorDefault,

        Ê"127.0.0.1").takeRetainedValue()

let hostNames: CFArray = CFHostGetNames(host, nil)!.takeUnretainedValue()

欢迎关注关东升新浪微博@tony_关东升。
关注智捷课堂微信公共平台,了解最新技术文章、图书、教程信息
                          ​
更多精品iOS、Cocos、移动设计课程请关注智捷课堂官方网站:http://www.zhijieketang.com
智捷课堂论坛网站:http://51work6.com/forum.php

《从零开始学Swift》学习笔记(Day 62)——Core Foundation框架之内存托管对象与非托管对象的更多相关文章

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

    原创文章,欢迎转载.转载请注明:关东升的博客 在Swift原生数据类型.Foundation框架数据类型和Core Foundation框架数据类型之间转换过程中,虽然是大部分是可以零开销桥接,零开销 ...

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

    原创文章,欢迎转载. 转载请注明:关东升的博客 在Swift原生数据类型.Foundation框架数据类型和Core Foundation框架数据类型之间转换过程中,尽管是大部分是能够零开销桥接,零开 ...

  3. 《objective-c基础教程》学习笔记(九)—— Foundation框架介绍

    在之前的博文中,我们创建的项目文件的时候,默认都有引用#import <Foundation/foundation.h> 这个头文件.但是,之前我们对Foundation都没有展开介绍.这 ...

  4. 《从零开始学Swift》学习笔记(Day60)——Core Foundation框架

    原创文章,欢迎转载.转载请注明:关东升的博客 Core Foundation框架是苹果公司提供一套概念来源于Foundation框架,编程接口面向C语言风格的API.虽然在Swift中调用这种C语言风 ...

  5. 《从零開始学Swift》学习笔记(Day60)——Core Foundation框架

    创文章,欢迎转载.转载请注明:关东升的博客   Core Foundation框架是苹果公司提供一套概念来源于Foundation框架,编程接口面向C语言风格的API.尽管在Swift中调用这样的C语 ...

  6. 关东升的《从零开始学Swift》即将出版

    大家好: 苹果2015WWDC大会发布了Swift2.0,它较之前的版本Swift1.x有很大的变化,所以我即将出版<从零开始学Swift> <从零开始学Swift>将在< ...

  7. Swift学习笔记(一)搭配环境以及代码运行成功

    原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹 ...

  8. 关东升的《从零开始学Swift》3月9日已经上架

    大家一直期盼的<从零开始学Swift>于3月9日已经上架,它是关东升老师历时8个月的呕心沥血所编著,全书600多页,此本书基于Swift 2.x,通过大量案例全面介绍苹果平台的应用开发.全 ...

  9. 【swift学习笔记】二.页面转跳数据回传

    上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...

随机推荐

  1. sql server xtype 对应数据类型名称sql查询

    SELECT c.name,c.user_type_id,t.name FROM sys.[columns] AS c INNER JOIN sys.types AS t ON t.user_type ...

  2. c# 读取文件流

    1.获取文件路径 2.编写读取路径文件信息 private string ReadFileStream(string filePath)         {             string st ...

  3. ss - float浮动模块的高度问题 解决方案

    当一个Div中的子元素都是浮动元素时,该div是没有高度的.通常会带来很多困扰,解决方案如下: 低版本统配兼容: overflow: hidden; 下面是不支持低配浏览器,而且似乎该效果对 P 标签 ...

  4. 基于vue实现百度离线地图

    基于vue实现百度离线地图 1. 百度地图API文件获取 有网络 的情况下,需引入百度地图API文件.如下: <script type="text/javascript" s ...

  5. spine findBone

    spBone* bone=skeletonAnimationNode->findBone("boneName"); CCPoint boneWorldPos=ccp(bone ...

  6. 环境搭建基础知识2(sublime text3中配置verilog语法高亮)

    需求说明:Verilog设计 内容       :verilog开发环境搭建 来自       :时间的诗 1 软件下载 1.1 官方下载 地址http://www.sublimetext.com/3 ...

  7. python操作sqlserver

    # coding=gbk import sys   import pymssql #尝试数据库连接 try:     conn = pymssql.connect(host="192.168 ...

  8. linux 查看java进程

    ps -ef|grep java 1. jps 或 ps –ef|grepjava (获取PID)

  9. man手册页

    man手册页不同页对应的内容: 区段1:用户指令区段2:系统调用区段3:程序库调用区段4:设备区段5:文件格式区段6:游戏区段7:杂项区段8:系统指令区段9:内核内部指令区段n:Tcl或Tk指令

  10. oracle表空间中PCTFREE, PCTUSED, INITRANS, MAXTRANX参数的解释

    1. PCTFREE 要形容一个 BLOCK 的运作,我们可以把一个 BLOCK 想成一个水杯.侍者把水倒入放在我们面前的水杯,要多满呢,我们要求他倒 9 分满好了,这时候 PCTFREE 代表着设定 ...