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

news/2024/7/20 23:04:54 标签: ios, 从零开始学Swift学习笔记, 关东升, 出版
原创文章,欢迎转载。转载请注明:关东升的博客

 

内存托管对象

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

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

获得这些内存托管对象的方法,是采用了CF_RETURNS_RETAINEDCF_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_RETAINEDCF_RETURNS_NOT_RETAINED注释声明,编译器无法帮助管理内存。在具体使用时候我们可以上一节的方法判断是否为非内存托管对象。

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

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

 

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

示例代码如下:

let host: CFHost = CFHostCreateWithName(kCFAllocatorDefault, 

        Ê"127.0.0.1").takeRetainedValue()

        

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

 

欢迎关注关东升新浪微博@tony_关东升
关注智捷课堂微信公共平台,了解最新技术文章、图书、教程信息
 

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

 


http://www.niftyadmin.cn/n/1036393.html

相关文章

【CSS】总结前端三剑客之一(CSS基础)

上一篇文章&#xff0c;我们介绍了HTML语言的基础用法后&#xff0c;今天我们继续学习CSS的基础语法。 CSS&#xff0c;又称为层叠样式表(Cascading Style Sheets)。CSS能够对网页中元素位置的排版进行像素级精准控制&#xff0c;实现美化页面的效果&#xff0c;能够做到页面的…

《从零开始学Swift》学习笔记(Day 64)——Cocoa Touch设计模式及应用之目标与动作

原创文章&#xff0c;欢迎转载。转载请注明&#xff1a;关东升的博客目标(Target)与动作(Action)是iOS和OS X应用开发的中事件处理机制。问题提出如图所示是一个ButtonLabelSample案例设计原型图&#xff0c;其中包含一个标签和一个按钮&#xff0c;当点击按钮的时候&#xff0…

【数据结构】数组区间更新-线段树

在讲解算法原型之前&#xff0c;我们先来看一道算法题&#xff0c;这道算法题很贴近生活&#xff0c;也就是我们小时候玩的俄罗斯方块。LeetCode699掉落的方块 题目描述的文字太多&#xff0c;我就简单点说&#xff0c;类似于俄罗斯方块&#xff0c;从上方掉下方块&#xff0c…

《从零开始学Swift》学习笔记(Day 65)——Cocoa Touch设计模式及应用之选择器

原创文章&#xff0c;欢迎转载。转载请注明&#xff1a;关东升的博客实现目标与动作关联使用UIControl类addTarget(_:action:forControlEvents:)方法&#xff0c;示例代码如下&#xff1a;button.addTarget(self, action: "onClick:", forControlEvents: UIControlEv…

【数据结构】数组区间更新-IndexTree(树状数组)

在前段时间&#xff0c;我们介绍过线段树&#xff0c;线段树是解决在数组区间上进行快速的增删改查操作。而今天我们讲得IndexTree也是为了达到这样类似的效果。 本期文章源码&#xff1a;GitHub 目录一、介绍二、IndexTree的实现1、add方法2、update方法3、query方法一、介绍 …

《从零开始学Swift》学习笔记(Day 66)——Cocoa Touch设计模式及应用之通知机制

原创文章&#xff0c;欢迎转载。转载请注明&#xff1a;关东升的博客通知&#xff08;Notification&#xff09;机制是基于观察者&#xff08;Observer&#xff09;模式也叫发布/订阅&#xff08;Publish/Subscribe&#xff09;模式&#xff0c;是 MVC&#xff08; 模型-视图-控…

【软件测试】性能测试工具基础-loadrunner12+jmeter

上期文章&#xff0c;我们讲了基于python的selenium&#xff0c;用于做自动化测试。今天就简单说一下性能测试方面的一些知识点。 文章目录一、性能测试相关概念二、loadrunner基本使用1、创建工程2、录制脚本3、回放脚本4、增强脚本1)检查点&#xff08;断言&#xff09;2)读取…

《从零开始学Swift》学习笔记(Day67)——Cocoa Touch设计模式及应用之MVC模式

原创文章&#xff0c;欢迎转载。转载请注明&#xff1a;关东升的博客MVC&#xff08;Model-View-Controller&#xff0c;模型-视图-控制器&#xff09;模式是相当古老的设计模式之一&#xff0c;它最早出现在Smalltalk语言中。现在&#xff0c;很多计算机语言和架构都采用了MVC…