void *与id类型相互转换

在MRC下,void *与id类型相互转换完全没问题。

id obj  = [[NSObject alloc] init];
void *p = (void *)p;
obj = (id)p;

但是在ARC下,这种直接转换编译器会报错,需要使用__bridge关键字:

id obj = [[NSObject alloc] init];  //引用计数为1
void *p = (__bridge void *)obj; //引用计数仍为1
id obj2 = (__bridge id)p ;// 引用计数为2,因为obj2是__strong

__bridge_retained与__bridge_transfer

与__bridge相关的还有另外两个:__bridge_retained和__bridge_transfer。

id obj = [[NSObject alloc] init]; //引用计数为1
void *p = (__bridge_retained void *)obj ;// 引用计数为2 //上述代码等价在MRC为
id obj = [[NSObject alloc] init];
[obj retain];
void *p = (__bridge void)obj
id obj = (__bridge_transfer id)p  //引用计数仍为1

//上述代码等价在MRC为id obj obj = (__bridge id)p
[obj retain];
[(id)p release];

CFBridgingRetain与CFBridgingTransfer

这两个函数也只在ARC下生效,等价于:

CFTypeRef CFBridgingRetain(id X) {
return (__bridge_retained CFTypeRef)X;
} id CFBridgingRelease(CFTypeRef X) {
return (__bridge_transfer id)X;
}

void *与id类型的相互转换的更多相关文章

  1. 关于void*类型的用法(相当于OC中的id类型)

    关于void*类型的用法(相当于OC中的id类型) 1.C++语言在对于void* 类型的使用很特别,因为void* 可以间接引用任何其他数据类型的指针,比如int*.float*甚至抽象数据类型的指 ...

  2. Date类型和Long类型的相互转换

    Date类型和Long类型的相互转换: import java.text.SimpleDateFormat; import java.util.Date; public class T { publi ...

  3. id类型

    id类型 在Objective-C 中,id 类型是一个独特的数据类型.在概念上,类似Java 的Object 类,可以转换为任何数据类型.换句话说,id 类型的变量可以存放任何数据类型的对象.在内部 ...

  4. OC id类型

    id数据类型可存储任何类型的对象.从某种意义说,它是一般对象类型. -------------------------"NormalMan.h"------------------ ...

  5. Objective-C 点语法 成员变量的作用域 @property和@synthesize关键字 id类型

    点语法 1.利用点语法替换set方法和get方法 方法调用 Student *stu = [Student new]; [stu setAge : 18]; int age = [stu age]; ...

  6. 张超超OC基础回顾_05 property修饰符,id类型,instancetype。。。

    一.property 如果给一个属性同时提供了getter/setter方法, 那么我们称这个属性为可读可写属性 如果只提供了getter方法, 那么我们称这个属性为只读属性 如果只提供了setter ...

  7. java日期类型与字符串类型的相互转换

    package cn.zwq.convert; import java.text.ParseException; import java.text.SimpleDateFormat; import j ...

  8. OC基础--构造方法 id类型

    new方法实现原理: new做了三件事情 1.开辟存储空间  + alloc 方法 2.初始化所有的属性(成员变量) - init 方法 3.返回对象的地址 [Person new]; == [[Pe ...

  9. <a href="javascript:void(0);" id='test' onclick="javascript:alert('即将上线,敬请期待!');"><em class="rmwd"></em>征稿平台</a>

    <a href="javascript:void(0);" id='test' onclick="javascript:alert('即将上线,敬请期待!');&q ...

随机推荐

  1. JavaScript 的基本概念( ES5 )

    语法 区分大小写 标识符 第一个字符必须是一个字母,下划线或者一个美元符( $ ).其他规则无论,最好按照通用的驼峰大小写. 注释 // 单行注释 /* 多行注释 */ 严格模式 在顶部添加如下代码 ...

  2. pyqt5对用qt designer设计的窗体实现弹出子窗口的示例

    pyqt5对用qt designer设计的窗体实现弹出子窗口的示例 脚本专栏 python 1. 用qt designer编写主窗体,窗体类型是MainWindow,空白窗口上一个按钮.并转换成mai ...

  3. 第三天·HTML常用标签

    一·<h1>-<h6> 单词缩写:headHTML的<h1>-<h6>代表了六个等级的标题,其中<h1>标签比较重要,因此要尽量少用.一般& ...

  4. C++入门经典-例5.1-输出变量的指针

    1:代码如下: // 5.1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...

  5. python利器之切片

     切片 切片的语法表达式为:[start_index : end_index : step],其中: start_index表示起始索引 end_index表示结束索引 step表示步长,步长不能为0 ...

  6. Android Context介绍

    转载(Android Context完全解析与各种获取Context方法):https://www.cnblogs.com/chenxibobo/p/6136693.html

  7. 使用DBLink方式同步远程数据库中含Blob、Clob字段表的问题解决

    在数据库同步中我们经常会用到DBLink方式.DBLink可以将物理上存放于网络的多个数据库在逻辑上当成一个单一的大数据库.开发人员无需关心数据库的网络分布,就能很方便的实现从不同数据库之间读取数据. ...

  8. leetcode-easy-others-190. Reverse Bits-NO

    mycode 不会... 参考: 1. 思路: 将十进制的n转换成二进制(str) -> 利用切片.反向获取不包含0b的反转后的二进制字符串 -> 补上0(共32位) 2. class S ...

  9. js 外部引用文件与 onload()函数的优先级

    在HTML页面中的body加载进来的时候,外部引用的js文件存放的位置 1.js文件放在body里面,则是按照body的加载顺序(按先后顺序)进行加载 2.js文件放在<head>标签里面 ...

  10. 汽车Lin总线特点

    串行通信:线间干扰小,节省线束,传输距离长 单线传输:增强的ISO 9141 (ISO 15765-1),总线电压基于VBAT 最高速率:20kbit/s 单主多从结构,无需仲裁:主节点同时包含主任务 ...