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

简介: <span style="font-family:宋体;font-size: 10.5pt; mso-ascii-font-family: Arial; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Arial; mso-bidi-font-family: A
原创文章,欢迎转载。转载请注明:关东升的博客

 

内存托管对象

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

 

目录
相关文章
|
11月前
|
NoSQL 关系型数据库 数据库
Swift 服务器框架对比
Swift 服务器框架对比
180 0
|
2天前
|
人工智能 自然语言处理 Swift
"轻量级微调推理框架SWIFT:大模型时代的速度革命,让你秒变AI部署高手!"
【8月更文挑战第17天】随着AI技术的发展,大模型如GPT-3和BERT引领风潮,但其部署与推理速度面临挑战。为此,魔搭社区推出了SWIFT(Simple Weight-Integrated Fine-Tuning)框架,它采用轻量级微调技术,实现模型参数压缩与加速,确保大模型能在移动端和边缘设备上高效运行。SWIFT具备四大特点:创新微调方法减少训练参数;内置优化策略提高推理速度;跨平台支持便于部署;兼容主流预训练模型。通过示例可见,从加载预训练模型到模型的微调、评估及导出,SWIFT简化了工作流程,降低了大模型的应用门槛,促进了AI技术的实际应用。
19 3
|
5天前
|
缓存 开发框架 .NET
看看 Asp.net core Webapi 项目如何优雅地使用内存缓存
看看 Asp.net core Webapi 项目如何优雅地使用内存缓存
|
1月前
|
物联网 PyTorch 算法框架/工具
介绍一个大语言模型的微调框架Swift | AIGC
介绍一个大语言模型的微调框架Swift 【7月更文挑战第4天】
109 3
|
3月前
|
API 图形学 Swift
【Swift开发专栏】Swift与Core Graphics框架
【4月更文挑战第30天】本文介绍了Swift如何与Apple的Core Graphics框架结合,用于高性能的图形渲染和用户界面设计。Core Graphics提供底层绘图接口,包括图形上下文、路径、颜色空间、渐变和阴影等概念。在Swift中,开发者可直接调用Core Graphics函数,创建图形上下文、设置绘图属性、绘制图形和处理图像。文章还展示了如何实现渐变填充、阴影效果及自定义绘图代码,帮助开发者利用Swift创造复杂的图形和动画。通过掌握这些技能,开发者能为移动应用打造更具吸引力的视觉体验。
66 1
|
3月前
|
持续交付 开发工具 Swift
【Swift开发专栏】Swift与第三方库和框架的集成
【4月更文挑战第30天】本文探讨了Swift中集成第三方库和框架的策略,包括选择有功能需求、社区支持、丰富文档和合适许可证的库。集成步骤涉及使用CocoaPods等工具安装,`import`导入库,遵循错误处理和性能优化。建议遵循代码组织、单一职责原则,做好错误处理和日志记录,使用版本控制和CI/CD,以提升项目稳定性和用户体验。
73 0
|
3月前
|
编译器 API Swift
【Swift开发专栏】Swift中的SwiftUI框架初探
【4月更文挑战第30天】SwiftUI是苹果2019年推出的界面构建框架,简化iOS应用开发。通过声明式语法和编译器优化,提供直观高效的UI设计。本文将介绍SwiftUI概述、主要特性及实际案例。SwiftUI强调“少即是多”,用少量代码实现复杂界面,提供简洁API、自动布局、双向数据绑定等功能。通过视图组合和实时预览加速开发。案例展示如何用SwiftUI构建用户列表界面,体现其结构清晰、易扩展的优势。SwiftUI在iOS开发中的重要性日益提升。
61 0
|
3月前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
241 2
|
29天前
|
Unix 调度 Swift
苹果iOS新手开发之Swift 中获取时间戳有哪些方式?
在Swift中获取时间戳有四种常见方式:1) 使用`Date`对象获取秒级或毫秒级时间戳;2) 通过`CFAbsoluteTimeGetCurrent`获取Core Foundation的秒数,需转换为Unix时间戳;3) 使用`DispatchTime.now()`获取纳秒级精度的调度时间点;4) `ProcessInfo`提供设备启动后的秒数,不表示绝对时间。不同方法适用于不同的精度和场景需求。
30 3
|
8天前
|
存储 移动开发 Swift
使用Swift进行iOS应用开发:探索现代移动开发的魅力
【8月更文挑战第12天】使用Swift进行iOS应用开发,不仅能够享受到Swift语言带来的简洁、快速、安全的编程体验,还能够充分利用iOS平台提供的丰富资源和强大功能。然而,iOS应用开发并非易事,需要开发者具备扎实的编程基础、丰富的实践经验和不断学习的精神。希望本文能够为您的iOS应用开发之旅提供一些有益的参考和帮助。

相关课程

更多