(九十九)桥接的介绍

OC中的桥接用于在C结构体(例如CFStringRef)和OC对象(例如NSString)之间进行转换。

在非ARC环境下,如果要实现转换,直接进行强制类型转换:

 // NSString转C String
 NSString *ocStr = [NSString stringWithFormat:@"OC字符串"];
 CFStringRef cfStr = (CFStringRef)ocStr;

 // 直接创建C String
 CFStringRef cfStr1 = CFStringCreateWithCString(CFAllocatorGetDefault(), "C String", kCFStringEncodingASCII);

 // C String转NSString
 NSString *ocStr1 = (NSString *)cfStr1;

在ARC环境下,不能这样转换,要借助桥接:

 NSString *ocStr = [NSString stringWithFormat:@"OC字符串"];
 CFStringRef cfStr = (__bridge CFStringRef)ocStr;

 NSString *ocStr1 = (__bridge NSString *)cfStr1;

桥接有三种方式:其中type是类型名,而expression一半不用填写。

(__bridge <#type#>)<#expression#>) 仅仅将值的地址进行转换,并没有转移对象的所有权,如果被桥接的对象释放,则桥接后的值也无法使用。在ARC下使用__bridge,因为所有权仍然属于OC,因此归ARC管制,不必手动释放。

(__bridge_retained <#CF type#>)<#expression#>) 将对象的所有权转移给桥接后的对象。

在ARC下使用__bridge_retained,此时ARC不能管理C语言内存,因此应该手动释放,应该使用CFRelease释放。等同于CFBridgingRetain(<#id X#>)

(__bridge_transfer <#Objective-C type#>)<#expression#>) 会转移所有权,并且会自动释放内存。等同于CFBridgingRelease(<#CFTypeRef X#>)

因此一般使用__bridge或者__bridge_transfer。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2025-01-20 04:40:20

(九十九)桥接的介绍的相关文章

JBoss 系列九十九:Rest WebService jBPM 6 集成示例

概述 jBPM 6 提供 Rest API 供第三方应用整合使用 jBPM 6,本文演示如果通过 Rest API: 启动流程 获取流程实例信息 启动 User Task 完成 User Task jBPM 6 中使用 RestEasy 实现 Rest WebService ,所以我们通过 Rest 客户端 API 与 jBPM 6 所提供的 Rest API 交互. 本文所使用的流程如下 如上流程只有一个 User Task 节点,User Task 执行开始和执行结束都输出相关提示.流程 I

百分之九十九的JAVA工作者都不知道的知识

1.Core Java部分 这是最基础的,对于一个java高级开发/设计人员,你需要对这一部分达到精通的水平,重点内容如下: a.面向对象编程思想(封装继承多态接口) b.字符串处理 c.java.lang包,java.util包等常用包 4.java异常处理 2.Java高级部分 a.Java I/O流 b.Java多线程技术 c.Java网络编程 d.Java Swing 后两项可以了解即可,如果项目需要可以深入研究 3.前端基本技能 * HTML + CSS网页开发 * JavaScrip

九、SELiunx介绍

9.1.SELinux介绍 selinux(Security Enhanced Linux ):SELinux 是在进行程序.文件等细部权限配置依据的一个核心模块!由于启动网络服务的也是程序,因此刚好也能够控制网络服务能否存取系统资源的一道关卡!其通过MAC(委任式存取控制) 的方式来控管程序.组成部分 主体 (Subject):程序 目标 (Object):文件系统 策略 (Policy): targeted:针对网络服务限制较多,针对本机限制较少,是默认的政策: strict:完整的 SEL

JavaScript设计模式样例九 —— 桥接模式

桥接模式(Bridge Pattern) 定义:是用于把抽象化与实现化解耦,使得二者可以独立变化. 目的:将抽象部分与实现部分分离,使它们都可以独立的变化. 场景:实现系统可能有多个角度分类,每一种角度都可能变化. let each = (arr, fn) => { for (let i = 0; i < arr.length; i++) { let val = arr[i] if (fn.call(val, i, val, arr)) { return false } } } let arr

设计模式C#实现(九)——桥接模式

意图 0 适用性 1 结构 2 实现 3 效果 4 意图 将抽象部分与它的实现部分分离,使它们都可以独立的变化. 适用性 1.不希望抽象和实现间有固定的绑定关系2.类的抽象以及它的实现都可以通过生成子类的方法加以扩充3.对抽象的实现部分的修改应对客户端不参产生影响4.在多个对象中共享实现 结构 实现 (这里所说的抽象层次和实现层次和面向对象的抽象和实现不同?把遥控器当作抽象,电视机当作实现是因为遥控器本身不会开关,只是命令电视机开关?这里抽象层次和实现层次的关系是聚合呀)遥控器 public c

套路一百人九十九人成功

男:你知道我喜欢喝什么酒吗 女:啤酒,白酒男:我喜欢和你天长地久 男:亲你一下好吗? 女:不行男:我刚才说什么了 女:亲你一下好吗 男:好啊 男:我非常喜欢一家店 女:什么店 男:你的来电 原文地址:https://www.cnblogs.com/kalezhangtao/p/10993072.html

一个屌丝程序猿的人生(九十九)

林萧沉默的站在原地,不停地喷云吐雾,此时的他,想到在厂子里的那段时间,突然觉得自己的自尊心受到了极大的侮辱,那段时间,他就像一个傻子一样,被欧阳晓耍的团团转,甚至还一度以为,这是上天赐予他的一份难得的良缘. 只不过这一切,在现实被揭开以后,已然成为了一个笑话. 想到这里,林萧甚至有种冲动,把欧阳晓赶出房间,让她自己在北京的冬夜里自生自灭,如此才能缓解自己心中的怒火. 不过当林萧想要付诸于行动的时候,脑子里却响起了另外一个声音,这个声音告诉他,做男人,不要这么矫情,自尊心才值几个钱?女生都已经送上

测开之路九十九:js函数、事件、window窗体对象

函数:function 函数名(参数列表) 事件 单击:onclick()表单提交:onsubmit()鼠标经过:onmouseover()值改表时:onchange() window窗体对象转跳:window.location = url 警告框:alert() 确认框:confirm("messge"),返回true 和false 接收用户输入 prompt("请输入内容", "默认值") <!DOCTYPE html><h

桥接模式(Bridge)

一.桥接模式介绍: 桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立的变化.而不会直接影响到其他部分. 未使用桥接模式的抽象与实现结构图(如下): 如果要增加一个apple品牌的电脑,则需要在台式机下新增一个apple的台式机 在笔记本下新增一个apple笔记本,在pad下新增一个apple的pad.代码比较繁琐. 如果使用桥接模式(如下图),使抽象部分和抽象的派生(实现)部分分离出来,这样让它们各自的变化,这样每种实现就不会影响到其他实现.从而达到对应变化的目的 将电脑类型作为一个维度