关于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函数一样被调用 封装一段代码 可以在任何地 ...
随机推荐
- asp.net正则表达式过滤标签和数据提取
无论什么语言,正则表达式的处理方法都是非常灵活.高效的,尤其是对某些字符串的抓取.过滤方面,更显其优势. 正则表达式的写法通常比较简单,几行短代码便能轻松完成看似很复杂的事情,更值得称赞的是,它的执行 ...
- ti processor sdk linux am335x evm /bin/create-sdcard.sh hacking
#!/bin/bash # # ti processor sdk linux am335x evm /bin/create-sdcard.sh hacking # 说明: # 本文主要对TI的sdk中 ...
- nginx - conf.d vs sites-available
自己理解: conf.d - 扩展配置文件,用户配置文件 sites-available - 配置 虚拟主机(nginx支持多个虚拟主机,sites-enabled(存放 软链接,指向sites-av ...
- Java [Leetcode 234]Palindrome Linked List
题目描述: Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) ...
- uestc 1721 吴神,人类的希望
// 将n个相同的球放进m个盒子 盒子不为空的方法总数// dp[i][j] 表示i个盒子 j个球的方法总数// 递推关系 dp[i][j]=dp[i-1][j-1]+d[i][j-i]// a. i ...
- 【转】使用autolayout常见错误
原文网址:http://www.cnblogs.com/xiaokanfengyu/p/4175091.html 使用autolayout常见错误 1:The view hierarchy is no ...
- Struts2中通配符
1.Struts2中通配符可通过请求的url路径来确定包.类.方法.返回值名. 如 <action name="*_*_*_*" class="cn.javass. ...
- request的用法
Request从几个集合取数据是有顺序的,从前到后的顺序依次是 QueryString,Form,最后是ServerVariables.Request对象按照这样的顺序依次搜索这几个集合中的变量,如果 ...
- solr4.5 schema.xml配置文件
schema.xml配置文件是用于定义index索引库的结构,有点类似于数据表表的定义. 当我们打开schema.xml配置文件时,也许会被里面密密麻麻的代码所吓倒,其实不必惊慌,里面其实就两个东西f ...
- hdu 2818 Building Block(加权并查集)2009 Multi-University Training Contest 1
题意: 一共有30000个箱子,刚开始时都是分开放置的.接下来会有两种操作: 1. M x y,表示把x箱子所在的一摞放到y箱子那一摞上. 2. C y,表示询问y下方有多少个箱子. 输入: 首行输入 ...