关于block以及__bridge的一些笔记
问题概要
- _block是否是一个OC对象?
__bridge相关。
_block是否是一个OC对象?
结论
- 一般来说,block可以看做一个OC对象,但是在编译器底层,block又可以被细分为block对象,独立于OC对象的存在。
分析
- 根据苹果官方文档,明确的指明block是一个OC对象。有兴趣的在文档里面搜索
Working with Blocks。 - 根据文档Clang 4.0 documentation里面描述的,这里引入一个概念——可保留对象指针(retainable object pointer),这是苹果官方文档Working with Blocks这章里面没有出现过的字眼,这里面是这样描述的:可保留对象指针分为三类: block块指针,OC对象指针,由
__attribute__((NSObject))标志的指针。 - block一般可以认为是一个OC对象,但是在编译器底层有细分为block对象,独立于OC对象的存在,但是无论怎么描述,可保留对象(一般认为的OC对象)指针都可以受ARC管理。
- 根据苹果官方文档,明确的指明block是一个OC对象。有兴趣的在文档里面搜索
__bridge相关。(参考文档Clang 4.0 documentation)
__bridge- 在文档中关于
__bridge的描述是这样的,可以实现非可保留对象指针以及可保留对象指针之间的转换,转换的两个对象必须一个是可保留对象,另外一个是非可保留对象,不做对象所有权转移,为了方便理解,可保留对象可以认为是一般情况下的OC对象(包括block等),非可保留对象可以认为是Core Foundation里面的对象等。
- 在文档中关于
__bridge_retain- 文档中对
__bridge_retained的描述是这样的,__bridge_retained把可保留对象指针类型转换为非可保留对象指针类型(不可以倒过来),转换前后对象所有权转移(从被转换者转移到转换者)。
(void)bridgeRetain{
CFStringRef fontName = (__bridge CFStringRef)@"PingFangSC-Thin";
CGFloat fontSize = ;
CTFontRef fontRef = CTFontCreateWithName(fontName, fontSize, NULL);
{
id obj = [[NSObject alloc] init];
fontRef = (__bridge CTFontRef)obj;
}
CFRelease(fontRef);
}- 使用
__bridge的情况
- 一个已经释放掉的对象重复释放,本质上是坏内存访问,无论调这个类的什么方法都会出现坏内存crash,并不特指释放方法,obj的对象所有权没有转移,还是由自身去管理内存,ARC下,可保留对象的内存管理在自动调用release来释放内存。
- 使用
bridge_retain之后可以运行通过,对象所有权转移到fontRef,所以必须要调用CFRelease函数来管理内存,不然会发生内存泄露。
- 文档中对
__bridge_transform__bridge_transform:把非可保留对象指针类型转换为可保留对象指针类型,对象所有权转移,ARC下,自动调用realeas操作。
//示例函数
(void)bridgeTransform{
CFStringRef fontName = (__bridge CFStringRef)@"PingFangSC-Thin";
CGFloat fontSize = ;
CTFontRef fontRef = CTFontCreateWithName(fontName, fontSize, NULL);
UIFont font = (__bridge_transfer UIFont)fontRef;
}使用
__bridge会出现内存泄露,fontRef的对象所有权没有转移,内存还是要手动释放。
- 使用__bridge_transform的情况,对象所有权转移,内存转移到font来管理,ARC下,可保留对象会自动调用release操作。
目前的项目中的使用很多关于__bridge的用法
- 有以下用法的,感觉先将UIImage转CGImage,在转id再赋给contents,感觉中间的操作是可以去掉的,但是去掉中间的操作发现contents展示是空的。
//这样animationView.contents = (__bridge id)MQZ_LOAD_QZONE_IMAGE_NO_CACHE("mqz_live_bg.jpg").CGImage;- 在《ios核心动画高级技巧》这本书中是这样描述的,造成这个现象是由Mac OS的历史原因造成的。它之所以被定义为id类型,是因为在Mac OS系统上,这个属性对CGImage和NSImage类型的值都起作用。如果你试图在iOS平台上将UIImage的值赋给它,只能得到一个空白的图层。
参看资料
- 文档Clang 4.0 documentation,苹果官方文档
- 书籍《ios核心动画高级技巧》
关于block以及__bridge的一些笔记的更多相关文章
- block的哪些事 --- 学习笔记十
//带有自动变量值的匿名函数 //block 与 C语言函数比只有两点不同,1.没有函数名. 2.带有"^". //类似于方法,如B中的值传给A中,在B中,一. 定义 : 二. 实 ...
- (8/18)重学Standford_iOS7开发_协议、block、动画_课程笔记
第八课: 1.协议 另一种安全处理id类型的方式如:id <MyProtocol> obj a.声明 //协议一般放于.h文件中或者在类的.h文件中 @protocol Foo <X ...
- Google C++编程风格指南 - 中文版
Google C++编程风格指南 - 中文版 from http://code.google.com/p/google-styleguide/ 版本: 3.133原作者: Benjy Weinberg ...
- ARC中block块作为属性的使用笔记
ARC中block块作为属性的使用笔记 block较难理解,根据在内存中的分布情况就分为3种类型,根据使用的情形又分为很多很多种.虽然用起来容易,但使用不当会造成内存泄露,虽然都是这么说,但你真的研究 ...
- 荼菜的iOS笔记--UIView的几个Block动画
前言:我的第一篇文章荼菜的iOS笔记–Core Animation 核心动画算是比较详细讲了核心动画的用法,但是如你上篇看到的,有时我们只是想实现一些很小的动画,这时再用coreAnimation就会 ...
- Linux文件系统与inode、Block笔记
Linux文件系统与inode.Block笔记 在Linux下一切都是文件,无论是设备还是接口,亦或是网卡等均被抽象成了文件,并且有相关的内核代码进行调度.然而,在一切都是文件的前提下,最需要进行探讨 ...
- CSS学习笔记——包含块 containing block
以下内容翻译自CSS 2.1官方文档.网址:https://www.w3.org/TR/CSS2/visudet.html#strut 有时,一个元素的盒子的位置和尺寸根据一个确定的矩形计算,这个确定 ...
- 黑马程序员_ Objective-c 之block、protocol学习笔记
一):block学习总结 block :用来保存一段代码. 1.block 特点: 1> Block封装了一段代码,可以在任何时候执行 2> Block可以作为函数或者函数的返回值, ...
- iOS 阶段学习第24天笔记(Block的介绍)
iOS学习(OC语言)知识点整理 一.Block 的介绍 1)概念: block 是一种数据类型,类似于C语言中没有名字的函数,可以接收参数,也可以返回值与C函数一样被调用 封装一段代码 可以在任何地 ...
随机推荐
- poj 1185 炮兵阵地(三维状态压缩dP)
题目:http://poj.org/problem?id=1185 思路: d[i][j][k]表示第i行的状态为第k个状态,第i-1行的状态为第j个状态的时候 的炮的数量. 1表示放大炮, 地形状态 ...
- ASP.NET MVC @helper使用说明
简单的 @helper 方法应用场景 Razor中的@helper语法让您能够轻松创建可重用的方法,此方法可以在您的视图模板中封装输出功能.他们使代码能更好地重用,也使代码更具有可读性. 在我们定义@ ...
- codevs 3123 高精度练习之超大整数乘法
fft. #include<iostream> #include<cstdio> #include<cstring> #include<complex> ...
- vim 支持 markdown 语法
/************************************************************************* * vim 支持 markdown 语法 * 说明 ...
- LeetCode Number of Islands 岛的数量(DFS,BFS)
题意:0代表水,1代表陆地,那么被水围起来的就是岛了,给一个01矩阵,问有多少个岛? 思路:DFS还是比较短,实现了一下.如果一个点已经被遍历过了,那就将其置为0就行了,不要去搜0的. class S ...
- C# chart控件绘制曲线
在.NET中以前经常用GDI去绘制,虽然效果也不错,自从.NET 4.0开始,专门为绘制图表而生的Chart控件出现了,有了它,就可以轻松的绘制你所需要的曲线图.柱状图什么的了. using Syst ...
- redis发布/订阅模式
其实在很多的MQ产品中都存在这样的一个模式,我们常听到的一个例子 就是邮件订阅的场景,什么意思呢,也就是说100个人订阅了你的博客,如果博主发表了文章,那么100个人就会同时收到通知邮件,除了这个 场 ...
- FTP文件上传与下载
实现FTP文件上传与下载可以通过以下两种种方式实现(不知道还有没有其他方式),分别为:1.通过JDK自带的API实现:2.通过Apache提供的API是实现. 第一种方式:使用jdk中的ftpClie ...
- XTUOJ 1246 Heartstone 贪心
题意:挺好懂得 分析:先计算出如果不能用(减2)操作,至少需要多少个(减3)操作,这个很好计算 然后就是尽量多的去减少(减3)操作,肯定先抹平 余2 和 余1 的,然后就可以了 #include &l ...
- SDUT 3571 Password 暴力搜索
这个题如果裸搜肯定超时了 但是我们可以枚举,用初始串的哪一位数字去填目标串的那一位数字 这样就是暴力6!,复杂度很低,然后需要解决过程中经过的点的问题, 因为是从左向右走,所以记录当前光标, 和当前达 ...