「OC」__bridge关键字的使用

深入了解Objective-C 和 Core Foundation 对象相互转换(_bridge) Foundation框架是使用OC实现的。 Core Foundation是使用C实现的,它们为iOS应用程序提供基本数据管理和服务功能; Foundation 对象和 Core Foundation对象间的转换:俗称桥接 bridge 针对内存管理问题,ARC 可以帮忙管理 Objective-C 对象, 但是不支持 Core Foundation 对象的管理,所以转换后要注意一个问题:谁 阅读详情

「OC」__bridge关键字的使用

前言

在学习小白书关于引用计数之中Foundation框架和Core Foundation框架相互转化后的相关内容,学习到了__bridge这个关键字,因此对其进行学习

引入

在cocoa应用中,我们离不开Foundation同时又经常用到Core Foundation,Foundation是Core Foundation的一层包装,其底层数据结构是一样的,我们可以使用__bridge在CF对象和NS对象之间相互转化,但是不移交所有权。

以下是书中给出的例子

NSString *str = @"abc";
CFStringRef cfstring = (__bridge CFStringRef)str;
NSLog(@"1 -- %@",cfstring);
NSString *s = (__bridge NSString *)cfstring;
NSLog(@"2 -- %@",s);
    
执行结果
1 -- abc
2 -- abc

因为Core Foundation对象与Objective-C对象没有区别,所以在ARC无效时,只用简单的C语言的转换也能实现互换。另外这种转换不需要使用额外的CPU 资源,因此也被称 为 “ 免费桥 " ( Toll-FreeBridge)。

CFTypeRef CBridgingRetain(id X) {
    return (__bridge_retained CFTypeRef)X;
}

id CBridgingRelease(CFTypeRef X) {
    return (__bridge_transfer id)X;
}

以上就是使用免费桥进行转换的程序,我们借机来深入了解一下__bridge_retained和__bridge_transfer

__bridge_retained:

  • 这条语句 (__bridge_retained CFTypeRef)X 告诉编译器把一个 ARC 管理的 Objective-C 对象转换为 Core Foundation 对象,同时转移所有权(即对象的引用计数不会减少,调用者需要负责释放)。
  • 这通常用于将对象传递给需要 Core Foundation 类型的 API,并且明确表示调用者接管了对象的释放责任。

__bridge_retained或CFBridgingRetain将OC指针转为CF指针并且移交所有权,需要CF通过CFRelease来负责对象的释放,以书中的例子:

CFMutableArrayRef cfObject = NULL;
{
  id obj = [[NSMutableArray alloc] init];
  // 此时,变量 obj 持有生成对象的强引用,引用计数为1

  // CFBridgingRetain 会把 ARC 管理的对象转换成 Core Foundation 对象,并且转移所有权(即对对象执行 CFRetain 操作),引用计数加1
  cfObject = CFBridgingRetain(obj); // 或写作: cfObject = (__bridge_retained CFMutableArrayRef)obj;

  // 现在,对象有两个所有者:obj 的强引用和 cfObject 的所有权引用,所以引用计数为2
  CFShow(cfObject);
  printf("retain count = %d\n", (int)CFGetRetainCount(cfObject));

 
}

 // 当 obj 超出其作用域后,ARC 自动释放 obj 持有的引用,对象引用计数减1,仍为1
printf("retain count after the scope = %d\n", (int)CFGetRetainCount(cfObject));

// 通过 CFRelease 手动释放 cfObject 的引用,对象引用计数减为0,对象被销毁
CFRelease(cfObject);

使用__bridge关键词直接代替

CFMutableArrayRef cfObject = NULL;

{
  id obj = [[NSMutableArray alloc] init];
  // 此时,变量 obj 持有生成对象的强引用,引用计数为1

  // 使用 __bridge 进行转换,仅仅是类型转换,不改变引用计数,也不转移所有权
  cfObject = (__bridge CFMutableArrayRef)obj;

  // 此时,对象只有一个所有者,即 obj,引用计数依然为1
  CFShow(cfObject);
  printf("retain count = %d\n", (int)CFGetRetainCount(cfObject));
}

// 当 obj 超出作用域后,ARC 会释放 obj 持有的对象,对象引用计数降为0,对象被释放
// 但 cfObject 仍保存着原始指针,此时 cfObject 成为悬垂指针
printf("retain count after the scope = %d\n", (int)CFGetRetainCount(cfObject));

// 如果继续使用 cfObject 或调用 CFRelease,可能会出现错误,因为对象已经被释放
// CFRelease(cfObject); // 切勿在 __bridge 转换后调用 CFRelease

__bridge_transfer:

  • 而 (__bridge_transfer id)X 则是将一个 Core Foundation 对象转换为 ARC 管理的 Objective-C 对象,同时将所有权转交给 ARC。
  • 这样 ARC 会负责对象的释放,无需手动调用 CFRelease。

和__bridge_retained相反,是将CF指针转为OC指针并移交所有权

{
  CFMutableArrayRef cfObject = CFArrayCreateMutable(kCFAllocatorDefault, 0, NULL);
  printf("retain count = %d\n", CFGetRetainCount(cfObject)); // 创建后引用计数为1

  // 通过 CFBridgingRelease 将 CF 对象转为 ARC 管理的 Objective-C 对象
  id obj = CFBridgingRelease(cfObject);

  // 此时,CF 对象的所有权已转移给 ARC,ARC 会对 obj 进行一次强引用(retain)管理
  printf("retain count after the cast = %d\n", CFGetRetainCount(cfObject)); // 引用计数仍为1

  NSLog(@"class = %@", obj);
}
// 当变量 obj 超出作用域,其强引用失效,对象会被自动释放(CFRelease 在内部调用)

使用__bridge关键词直接代替

{
   CFMutableArrayRef cfObject = CFArrayCreateMutable(kCFAllocatorDefault, 0, NULL);
  printf("retain count = %d\n", CFGetRetainCount(cfObject)); // 创建后引用计数为1

  // 使用 __bridge 转换,将 CF 对象赋值给 ARC 管理的 Objective-C 对象
  id obj = (__bridge id)cfObject;

  // 由于赋值给强引用的变量,ARC 会额外对对象进行一次 retain,引用计数变为2
  printf("retain count after the cast = %d\n", CFGetRetainCount(cfObject)); // 引用计数为2

  NSLog(@"class = %@", obj);
}

// 当变量 obj 超出作用域,ARC 会自动释放其持有的引用,但 CF 对象仍有一份原始引用
// 这会导致对象未被销毁,发生内存泄漏!

慎用

尽管以上方法,可以实现C语言框架和OC框架的互换,但是我们这些方法尽可能还是少用,因为对于CF框架的内容来说,很容易忘记作用域相关的问题

void *p;
{
    Son *son = [[Son alloc] init];
    // 将OC指针转为CF指针赋值给p
    p = (__bridge void *)son;
    // 出了作用域OC对象就要释放了
}
// 这里访问空对象会出问题
NSLog(@"%@",p);

我们需要使用的是__bridge_retained

    void *p;
    {
        Son *son = [[Son alloc] init];
        // 将OC指针转为CF指针赋值给p,并将所有权交给CF管理
        p = (__bridge_retained void *)son;
        // 出了作用域并不会影响p对象
    }
    // 这里仍然可以正常访问
    NSLog(@"%@",p);
    
执行结果
<Son: 0x281210150>

华为od机试|华为od机试真题2025|华为od题库|华为od机考|2025C卷B卷 华为od机试|华为od机试真题2025|华为od题库|华为od机考|华为od机试|华为od机试真题2025|华为od题库|华为od机考|华为od机试|华为od机试真题2025|华为od题库|华为od机考|华为od机试|华为od机试真题2025|华为od题库|华为od机考|B卷C卷 阅读详情

相关推荐

汽车车牌识别系统实现(二)--车牌定位+代码实现

汽车车牌识别系统实现(二)-- 车牌定位 前言 本人大四计算机视觉处理方面菜鸟一枚,因个人兴趣和毕设的缘故,故而想学习计算机视觉方面的内容,有不正确的地方还等各位大神批评指正。 图像预处理 照相机获取到汽车车牌图像时,绝大多数情况下,图像里只存在一个车牌的情况是不太现实的,一幅图像里存在建筑物、树、其它汽车等等是很正常的;而且绝大多数都会存在噪声点,这种情况下就会对车牌定位和识别造成极大程度的干扰...

奋斗の博客 1万+

C与OC的桥接

C、OC转换注意事项

u010596262的博客 988

刷题单向链表

实现一个数据结构,维护一张表(最初只有一个元素 11)。接下来 qq 行,每行表示一次操作,操作具体间题目描述。a[i] 里面放的是下一个元素,为0代表链表结束。如单链表1->4 -> 2->3->0用数组表示是。对于每个操作 2,输出一个数字,用换行隔开。第一行一个整数 qq 表示操作次数。

power的专栏 1714

iOS中的__bridge,__bridge_transfer和__bridge_retained

OC对象与CF对象的桥接一、Core Foundation框架与Foundation框架类型之间的桥接Core Foundation框架是C语言接口,而Foundation使用OC语言,在同时使用时,数据类型会有差异,我们可能需要OC与CF之间进行相互转化,这时我们就需要__bridge系列声明。1、OC转CF,__bridge、__bridge_retained声明假设一个类型转化的场景,例如:N

zramals的博客 521

VC Spyglass CDC实战:从TCL脚本到SDC约束的完整避坑指南

本文是一份针对数字IC验证工程师的VC Spyglass CDC实战指南。文章详细阐述了从TCL脚本环境搭建、SDC约束编写到典型CDC违规(如SETUP_PORT_UNCONSTRAINED)诊断与修复的完整流程,旨在帮助读者高效避坑,深入理解工具逻辑,从而完成可靠的时钟域交叉验证。

go5gopher的博客 382

达梦数据库JDBC连接池断开自动重连设置

一、场景 在网络状况不是非常良好,经常会出现暂时性的拥塞或者断开的情况,而且当我们重启数据库时也会发生类似的情况。所以需要配置中间件的连接池来实现连接测试以及自动重连,通过重新配置连接池,成功解决了这个问题。下面会给出一份数据源配置参数详单和一份推荐的数据源配置项。 二、连接池配置参数 1. initialSize:连接池启动时创建的初始化连接数量 2. maxActive:连接池中可同时连接的最大的连接数 3. maxIdle:连接池中最大的空闲的连接数,超过的空闲连接将被释放,如果设置为负

lilv1989的博客 7235

ARC下OC对象和CF对象之间的桥接(bridge)

在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics、Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环境下编译器不会自动管理CF对象的内存,所以当我们创建了一个CF对象以后就需要我们使用CFRelease将其手动释放,那么CF和OC相互转化的时候该如何管理内存呢?答案就是我们在需要时可以使用__bri...

weixin_30432007的博客 198

初识Renode

1. 简介 Renode是Antmicro公司发布的一个开发框架,使得开发人员通过模拟物理硬件系统(包括CPU、外围设备、传感器、环境以及节点之间的有线或无线介质),加速物联网和嵌入式系统的开发。它可在PC上通过软件对嵌入式设备进行模拟,可模拟Cortex-M、Cortex-A、RISC-V和其他CPU,并可模拟外设以及各种通信总线和接口。其指令模拟器使用C语言开发,外设模拟器使用C#语言开发,测试及输出层面的内容则用python编写。 Renode官网:Renodehttps://renode.io/

牧羊女 5291

__bridge 使用注意

前奏 在平常开发中,我们可能遇到 CoreFoundation(CF) 框架的对象和 OC 对象之间的类型转换,这时候我们需要 __bridge 来帮忙 注意 : 如果是使用 CF __bridge CF -> OC (只完成类型转换) - (void)bridgeCF2OC{ CFStringRef aCFString = CFStringCr...

weixin_30245867的博客 411

YOLO11训练中的过拟合识别与应对策略:讲解过拟合的表现、原因及应对方法(如数据增强、正则化、DropOut)

摘要 本文深入探讨了YOLO11目标检测模型中的过拟合问题。首先解析了过拟合的本质,即模型在训练数据上表现优异但泛化能力差的现象,并通过误差分解公式解释了其数学原理。文章详细列举了YOLO11中过拟合的具体表现,包括训练与验证指标分化、检测性能不一致性、置信度分布异常和类别检测不均衡等问题,并提供了对应的可视化诊断方法。 在原因分析部分,重点阐述了模型复杂度与数据规模不匹配、训练数据质量与分布问题以及训练策略不当三大根本原因。特别对比了YOLO11不同版本(n/s/m/l/x)的参数量和推荐最小数据量,指出

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 242

【实战教程】OpenClaw接入MySQL数据库实战指南

本文介绍了在虚拟机Ubuntu中访问宿主机Win11中MySQL数据库的配置方法,重点包括创建远程用户、权限配置和安全设置。首先在MySQL中创建具有只读权限的用户并刷新权限,然后调整服务器设置允许远程连接。文章还提供了某金融机构财富管理系统的数据库设计方案,包含理财产品表、客户表和份额表的核心结构,其中金额字段使用DECIMAL类型确保精度,并设置唯一键约束。文末强调测试环境配置完成后应恢复安全更新模式以保障生产环境安全。

海兰 8696

__bridge, __bridge_transfer, __bridge_retained

转载自微信公众号“知识小集” __bridge,__bridge_transfer,__bridge_retained几乎是一百年多前的知识点了,关于它们在 ARC 下的用法已有大量文章。但是这东西乍一看好简单,实际上也确实简单,但过段时间不接触再来用却难免又会犯迷糊。因此本文以更加详细的方式梳理一遍,旨在讲清楚来龙去脉,而不止是用法。 0. 一些说明 针对后面会用到的描述...

diaoxian5386的博客 450

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

OS OC类型和C类型相互转换

OS OC类型和C类型相互转换 http://blog.youkuaiyun.com/shencaifeixia1/article/details/8147117 __bridge:不涉及对象所有关系改变 __bridge_transfer:给予 ARC 所有权 __bridge_retained:解除 ARC 所有权 形式: (__bridge type)

dadamengyi的博客 482

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

iOS OC类型和C类型相互转换

http://blog.youkuaiyun.com/shencaifeixia1/article/details/8147117 __bridge:不涉及对象所有关系改变 __bridge_transfer:给予 ARC 所有权 __bridge_retained:解除 ARC 所有权 形式: (__bridge type)expression; (__bridge_retained C

mali_xiangzi的专栏 1067

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

__bridge ARC下OC对象与CF对象桥接

__bridge:不涉及对象所有关系改变 __bridge_transfer:给予 ARC 所有权 __bridge_retained:解除 ARC 所有权 在ARC中,OC对象与非OC对象在强制转换中,需要使用以上三个关键字进行桥接,那么三个关键字各用在什么情况下呢?详解如下: 下面一行代码: CFStringRef s1 = (CFStringRef)[[NSString all

小小幸 1740

IOS之 OC 和 C类型转换

在OC和 C之间互相调用的时候,有时候必须用一些桥接关键字.   __bridge只做类型转换,但是不修改对象(内存)管理权;  __bridge_retained(也可以使用CFBridgingRetain)将Objective-C的对象转换为Core Foundation的对象,同时将对象(内存)的管理权交给我们,后续需要使用CFRelease或者相关方法来释放对象; __bridge_

学无止境! 无休无止! 1943

__bridge 等方法的使用

在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics、Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环境下编译器不会自动管理CF对象的内存,所以当我们创建了一个CF对象以后就需要我们使用CFRelease将其手动释放,那么CF和OC相互转化的时候该如何管理内存呢?答案就是我们在需要时可以使用__bri

strong90的博客 986

__bridge, __bridge_transfer和__bridge_retained 的使用

Core Foundateion是C语言的接口,Foundation是OC的接口,有ARC来管理内存,Core Foundation需要自己管理内存。 涉及到Core Foundation的结构体转化到Foundation的对象或者反过来的时候,需要用到上述3个关键字。__bridge,CF和OC对象转化时,只涉及对象类型转化,不涉及所有权的转化。 讲一个OC对象转化成一个CF对象的时候,使用_

揽月御歌行 593

__bridge的相关使用

__bridge的相关使用ARC(Automatic Reference Count:自动引用计数)是苹果在WWDC2011年大会提出的用于内存管理的一项技术,解决了iOS中90%的内存管理问题,让程序员从MRC(Manual Reference Count:手工引用计数)解放了出来。这篇文章不涉及ARC的原理,因为这方面优秀的博客有很多,我就主要总结一下使用ARC可能忽略的一些问题。bridge,

ZeroOnet的博客 738
上一篇: Effective Objective-C 2.0 读书笔记——内存管理(下)
下一篇: 「OC」小白书读书笔记——Block的相关知识(上)
小鹿撞出了脑震荡
博客等级 码龄3年 1107粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值