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

内存托管对象

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

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

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

-(CGPathRef)maketoPathCF_RETURNS_RETAINED
{
UIBezierPath*triangle=[UIBezierPathbezierPath];
[trianglemovetoPoint:CGPointZero];
[triangleaddLinetoPoint:CGPointMake(self.view.frame.size.width,0)];
[triangleaddLinetoPoint:CGPointMake(0,self.view.frame.size.height)];
[triangleclosePath];
CGPathReftheCGPath=[triangleCGPath];
returnCGPathCreatecopy(theCGPath);
}


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

funcCFStringCreateWithCString(_alloc:CFAllocator!,_cStr:UnsafePointer<Int8>,_encoding:CFStringEncoding)->CFString!//内存托管对象

funcCFHostCreatecopy(_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()方法获得对象。

示例代码如下:

lethost:CFHost=CFHostCreateWithName(kcfAllocatorDefault,"127.0.0.1").takeRetainedValue()

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


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

wKioL1beOc_CMTlhAAAs2MBEZnc139.png


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

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

  1. ios – UIColor到十六进制(网页颜色)

    有没有简单的方法将UIColor转换为十六进制值?

  2. ios – 如果我将自动释放的对象桥接到Core Foundation,我必须使用__bridge或__bridge_retained吗?

    ARC迁移工具遇到了这个问题:特别是,它不确定它是否应该执行__bridge或__bridge_retained.而我也是.-fileURLWithPath返回一个自动释放的对象,在这个地方我不是fileURL的所有者.但与此同时,该对象的保留计数至少为1.我敢打赌,这只能用__bridge来完成.解决方法您只想为此使用常规__bridge强制转换.仅当您想要管理强制转换CF对象的生命周期时,才会使用__bridge_retained.例如:所以__bridge_retained确实告诉编译器你有一个AR

  3. Swift学习笔记十七——导入Foundation使用更多字符串功能

    在Xcode6.3版本中,默认创建playground项目时会导入一个UIKit包。但是如果没有导入UIKit包,可以通过importFoundation,来使用更多的字符串功能。字符串首字母大写方法:capitalizedString输出结果如下:。但是最初str的值并未改变。删除字符串前缀后缀方法:stringByTrimmingCharactersInSet输出结果:。以上方法都在Foundation下,使对字符串的操作更加灵活方便。

  4. Swift中的集合类数据结构

    在那种情况下,你将会需要一种基本的集合类数据结构。继续学习,你将会比较成熟的Cocoa数据结构与对应的纯Swift结构的性能。常见iOS数据结构iOS中三种最常用的数据结构是arrays,dictionaries和sets。除了在Swift和Objective-C中旧的Foundation框架中的数据结构,现在又有了新的仅支持Swift版本的数据结构与语言紧密结合在一起。Swift数组是同质的,意味着每一个Swift数组都只包含一种类型的对象。

  5. Swift 2.0学习笔记Day 1——我的第一行Swift代码

    importFoundationvarstr="HelloWorld"print晕晕、好吧,低头继续往下看,哦明白了第一句:importFoundation表示引入Foundation框架。Foundation是OSX和iOS应用程序开发的基础框架,它包括了一些基本的类,如数字、字符串、数组、字典等。UIKit框架是iOS图形用户界面开发需要框架,包括常见的视图和视图控制器等。

  6. Swift访问Foundation框架

    Foundation框架提供了大量的界面无关的api,为CoreFoundation框架的许多功能提供了Objective-C和Swift的封装。Foundation定义了大量的类,大体可分为值对象集合操作系统服务:文件系统、URL、进程通讯通知归档和序列化-下面的代码,基于Swift,对Foundation常用的api进行了简单的访问。包括结构体NSRange、NSSize、NSPoint,日期NSDate,字符串Nsstring,文件读写,字典操作等。说明写在注释中。

  7. 《从零开始学Swift》学习笔记Day60――Core Foundation框架

    虽然在Swift中调用这种C语言风格的API比较麻烦,但是在OSX和iOS开发过程中,有时候使用CoreFoundation框架的API是非常方便的,例如在与C语言混合编码的时候。CoreFoundation框架与Foundation框架紧密相关,他们具有与相同的接口,但是不同。CoreFoundation框架是基于C语言风格的,而Foundation框架是基于Objective-C语言风格的。看看Swift原生类型与CoreFoundation类型之间的转换示例:这个转换过程中CoreFoundatio

  8. 《从零开始学Swift》学习笔记Day 61――Core Foundation框架之内存管理

    Swift类型内存管理是采用ARC,Foundation类型和CoreFoundation类型内存管理都是采用MRC或ARC,CoreFoundation类型内存管理是基于C语言风格的,它有一个对象所有权的概念Objective-C的MRC内存管理CoreFoundation的内存管理与Objective-C的MRC内存管理密不可分,先介绍一下Objective-C的MRC内存管理。为了保证对象的存在,可以调用retain方法保持对象,retain方法会使其引用计数加1,如果不需要这个对象可以调用rele

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

    内存非托管对象内存非托管对象就是内存需要程序员自己管理。这是由于在获得对象的方法中没有使用CF_RETURNS_RETAINED或CF_RETURNS_NOT_RETAINED注释声明,编译器无法帮助管理内存。内存非托管对象使用起来有些麻烦,要根据获得所有权方法,进行相应的处理。调用者不再使用对象时候,Swift代码中需要调用CFRelease函数放弃对象所有权,这是因为Swift是ARC内存管理的。

  10. Swift:Foundation框架中的NS前缀的由来

    可能大家对于著名的NS前缀的由来有一些疑问.绝大多数这些NS前缀的类是NeXTSTEP操作系统中Foundation框架里的一部分,而该操作系统是OSX的基础.NeXTSTEP的程序员对它们的类和函数使用NX前缀.这个前缀在NeXT和Sun合作创建OpenStep之后被改为NS,OpenStep是一个面向对象的框架,它用来在其他平台上提供类似于NeXTSTEP的环境.所以,取决于你向谁提出这个问题,一些人会说NS指的是NeXTSTEP,而另一些人会说NS指的是NeXT/Sun.;]

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部