原创文章,欢迎转载。转载请注明:关东升的博客
在Swift原生数据类型、Foundation框架数据类型和Core Foundation框架数据类型之间转换过程中,虽然是大部分是可以零开销桥接,零开销并不意味着内存什么都不用管。Swift类型内存管理是采用ARC,Foundation类型和Core Foundation类型内存管理都是采用MRC或ARC,Core Foundation类型内存管理是基于C语言风格的,它有一个对象所有权的概念。
Objective-C的MRC内存管理
Core Foundation的内存管理与Objective-C的MRC内存管理密不可分,先介绍一下Objective-C的MRC内存管理。
所有Objective-C类都继承NSObject类,每个NSObject对象都有一个内部计数器,这个计数器跟踪对象的引用次数,被称为“引用计数”(Reference Count,简称RC)。当对象被创建时候,引用计数为1。为了保证对象的存在,可以调用retain方法保持对象,retain方法会使其引用计数加1,如果不需要这个对象可以调用release或autorelease方法,release或autorelease方法使其引用计数减1。当对象的引用计数为0的时候,系统运行环境才会释放对象内存。
引用计数示例如图所示,首先在第①步调用者A中创建了一个NSObject对象,这时该对象引用计数为1。在第②步调用者B中想使用这个NSObject对象,于是使用NSObject对象引用,但是为了防止使用过程中NSObject对象被释放,可以调用retain方法使引用计数加1,这时引用计数为2。在第③步调用者A中调用release或autorelease方法,使引用计数减1,这时引用计数为1。在第④步调用者C中调用release或autorelease方法,只是获得NSObject对象引用,并没有调用retain、release或autorelease方法,因此没有引起引用计数的变化。在第⑤步调用者B中调用release或autorelease方法使引用计数减1,这时引用计数为0。这个时候NSObject对象就内存就可以释放了。
<!--[endif]-->
来总结一下:
1. 谁创建或拷贝对象,他也一定要负责调用NSObject对象release或autorelease方法,使引用计数减1,如图中调用者A在第①步,负责创建了NSObject对象,那么调用者A也必须是负责使引用计数减1,见第④步。
2. 谁调用retain方法使引用计数加1,它也一定要负责调用NSObject对象release或autorelease方法,使引用计数减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中程序就会发生运行期错误。
相关推荐
从零开始学swift,图灵原创,关东升著。基于swift2.x。2016年3月版
这些笔记可能涉及更深入的主题,比如Optionals、闭包、泛型、Swift的内存管理模型(如自动引用计数ARC)以及UI设计与Swift的结合等。 "The Swift Programming Language.pdf" 是Apple官方发布的《Swift编程语言》...
Swift学习笔记含项目代码.zipSwift学习笔记含项目代码.zipSwift学习笔记含项目代码.zipSwift学习笔记含项目代码.zipSwift学习笔记含项目代码.zipSwift学习笔记含项目代码.zipSwift学习笔记含项目代码.zipSwift学习...
以下是从零开始学习SwiftUI的一些建议: 了解Swift语言基础:SwiftUI是用Swift语言编写的,因此了解Swift语言的基础知识是非常重要的。你可以从苹果官方文档、在线教程或书籍中学习Swift语言。 学习SwiftUI基本概念...
Foundation框架是Apple的Objective-C和Swift编程语言的核心部分,它为应用程序提供了一套基本的数据管理和服务。以下是Foundation框架的一些关键知识点: 1. **NSObject**: 所有Objective-C对象的基类,提供了内存...
在实践项目中,你将学习如何使用UIKit或SwiftUI框架构建用户界面,掌握数据持久化技术如Core Data或SQLite,以及如何利用网络请求库如Alamofire来实现网络通信。随着技能的提升,你还可以探索Swift的开源生态系统,...
在Swift开发中,我们可以利用UIKit或者Core Graphics框架来实现这一功能。 首先,我们需要了解贝塞尔曲线的基本概念。贝塞尔曲线由控制点和起点、终点共同决定,分为线性、二次、三次及更高次的类型。在这个案例中...
本教程旨在帮助初学者从零开始学习Swift编程,并通过实战微博App的项目开发,掌握iOS应用的基本构建过程。 一、Swift语言基础 Swift是Apple为iOS、iPadOS、macOS、watchOS和tvOS开发的开源编程语言。它的设计目标是...
Swift编程入门教程,从零开始,深入浅出的Swift语言学习指南; Swift编程入门教程,从零开始,深入浅出的Swift语言学习指南; Swift编程入门教程,从零开始,深入浅出的Swift语言学习指南; Swift编程入门教程,从零...
Swift是Apple为开发iOS...在学习Swift基础框架时,理解每个框架的用途和使用场景,以及它们之间的协同工作,是成为熟练Swift开发者的必要步骤。通过实践项目,将理论知识应用到实际开发中,可以更深入地掌握Swift编程。
Swift编程语言以其强大的功能和易读性在iOS应用开发领域占据了一席之地,而CocoaTouch框架则是构建iOS应用程序的核心工具。本视频教程将引导您深入理解CocoaTouch,并逐步掌握开发iOS应用的关键技巧。 首先,Cocoa...
在本教程中,“从零开始学iOS7开发系列教程-事务管理软件开发实战”,我们将深入探索iOS应用开发,特别是针对iOS7系统。这个教程涵盖了从基础到进阶的多个方面,旨在帮助初学者掌握iOS7开发的核心技术,并通过实战...
"swift-基于WKWebView控件上跨平台框架"是一个专注于利用WKWebView实现跨平台功能的项目,旨在提升移动应用的性能和用户体验。WKWebView是苹果在iOS 8及更高版本中引入的一个重要组件,它替代了旧有的UIWebView,为...
在Swift开发中,结合Apple的CoreML框架与TinyYOLOv1模型,可以实现高效的对象检测功能。这个项目,"swift-iOS-CoreML-Yolo",是专为iOS设备设计的,利用强大的机器学习能力来识别和定位图像中的特定对象。下面我们将...
目前最全最火的swift学习资源和笔记,非常适合小白入门 目前最全最火的swift学习资源和笔记,非常适合小白入门 目前最全最火的swift学习资源和笔记,非常适合小白入门 目前最全最火的swift学习资源和笔记,非常...
此外,理解Swift的内存管理,包括自动引用计数(ARC)和弱引用(weak),也是至关重要的。 总之,"Swift学习代码.zip"提供了全面的学习路径,涵盖了从基础语法到高级特性的Swift编程知识。通过逐步学习并实践每个...
对于更复杂的字符串操作,如正则表达式匹配,可以利用`Foundation`框架中的`NSRegularExpression`类。 在CSV文件解析方面,Swift标准库并没有提供内置的解决方案,但我们可以利用`Scanner`类来手动实现,或者引入第...
在本项目中,"swift-Core-ML-Sample"是一个基于Swift 4的示例应用,它展示了如何利用苹果的Core ML框架进行机器学习任务。Core ML是Apple为iOS、macOS、watchOS和tvOS设备引入的一个强大的机器学习库,允许开发者在...