MRC工程转ARC工程小记

LangChain4j + Milvus 从0-1实现会话管理与RAG检索的AIChat超详细教程 本教程将介绍如何使用LangChain4j和Milvus向量数据库构建一个具备流式输出、会话管理、会话隔离和基于文档RAG检索能力的AI机器人。我们将使用阿里百炼模型作为LLM后端,并通过Docker部署Milvus向量数据库。创建Assistant接口,定义聊天服务:LangChain4j 中文文档 | LangChain4j 中文文档wiringMode :这个属性一般两种,一种是自动装配,我们这里选择手动配置。 阅读详情

转自:阿毛的蛋疼地 http://xiangwangfeng.com/2014/02/20/MRC工程转ARC工程小记/

春节前抽空花了一天的时间将手头的工程从MRC转成了ARC,然后陆陆续续地修复一部分因为转ARC引起的内存泄漏和崩溃,到目前为止工程也算是比较稳定了,抽空记上一笔。(虽说这种事情这辈子估计都只会做这么一次了,但是可以留点经验给后来的童鞋)

这个工程启动于12年底13年初,一开始人手少工期短,需要尽快地出demo,同时抱着对面世才一年多的ARC不太信任的态度沿用了最熟悉的MRC。但是随着工程投入的人手增多,使用MRC的各种缺点也暴露无遗:

  • 零星的内存泄漏增多,导致每次发版本之前都要捋一遍:费时费力不讨好。虽然我一直觉得iOS下这种零星的内存泄漏并不是多大的事,真正压死一个App的泄漏永远是某些Bitmap的泄漏。但是这种零星泄漏仍旧会带来很多麻烦,所以还是需要解决一下。
  • 无法享受到ARC下weak关键字带来的好处:总有童鞋忘记在对象析构时去置空delegate。系统控件如UIScrollView,MKMapView的delegate仍旧需要自己释放,但是自定义procotol并将属性设为weak的delegate就可以获得weak属性带来的好处。
  • ARC下编译器对于retain cycle的检测更为严格。(个人使用后的感觉)
  • 越来越多的第三方库只提供ARC版本,虽然打标记可以解决问题,但增加了无谓的工作。

基于以上4点理由,于是选了春节前一个月高风黑夜悄悄地完成工程的ARC转换。23333333333333333

准备工作

1.一个MRC模式的工程。(嗯!)

2.一个合适版本的XCode。(你是鸡丁?不,我是喜儿肉丝)虽然XCode4之后就支持了ARC的自动转换,但是对ObjC++的支持却还是在XCode5之后。

3.一台性能彪悍的机器。个人悲惨经历:某天下午用自己那台老爷机做了一次转换,结果在最后一步机器直接卡死,重启后XCode也无法使用,最后只得重装XCode了事。

使用XCode做最基本的转换

1.开启即使出错也继续编译的选项:"Preferences" -> "General" -> "continue building after error" 。当转换开始后工程将出现大量的错误,与其每次fix一个错误再来一遍,还不如一口气让编译器把所有的错误都先汇报出来,再一一解决。(我们的工程大约20来万代码,检查出了近200个错误)

2.检查第三方库和自己的代码。对于第三方库,有ARC版本就进行替换,没有则打上-fno-objc-arc的标记(当然如果第三方库比较简单,也可以直接做转换)。而自己的代码则推荐全部做ARC的转换。

3.使用XCode提供的Convert to Objective-C ARC功能,选择当前需要转换的工程并执行。

4.正常情况会出现比较多的错误和retain-cycle的warning,推荐优先解决掉所有error,而warning暂时不处理,等转换完毕编译通过后再进行处理。而error和warning一般也就是下面几种情况:

  • 对于NSObject和CF对象没有使用bridge cast,大多数情况下直接按照XCode的推荐方式进行fix即可。
  • 原来MRC下使用了ARC下不允许使用的方法,如NSMakeCollectable。
  • 原先使用__block关键字避免循环引用的地方在ARC往往会引起循环引用,原因是__block在MRC和ARC下的语意不同,MRC下生成的__block结构体内只是简单地指向原值地址,而ARC下则是由__block结构体持有了原值,使用__weak进行修改即可。

处理完毕后重复第三步直到顺利编译通过。

后续处理

完成前面的步骤整个转换就算完成了百分之九十,但是正所谓行百里者半九十,接下去的任务更加艰巨,更需要认真对待。

1.检查工程内的所有文件,包括是否设置了合理的编译选项和被包含在工程内:XCode似乎有个bug,在转换完成后部分文件会被移出工程,部分文件原先打好的-fno-objc-arc标记也会被重置。

2.运行Instrument,检查内存泄漏:此时存在的内存泄漏大多是一些对ARC不适用的MRC写法。典型的情况便是将delegate作为类内部成员变量,在转换为ARC后系XCode并不会在这些变量前面打上weak的标记,导致了循环引用,需要自己手动添加。

3.对你的程序进行冒烟,尽量走完主流程,检查是否有必现崩溃。一般都是由错误的bridge cast和使用MRC时的不规范写法引起:如万恶的[self retain],在ARC转换时XCode直接去掉这句话,这样就导致原先依赖于此的类往往在初始化后就直接被释放,造成野指针访问。(吐槽下,无论是MRC还是ARC下,自己去拥有自己这种做法都是不太好的做法)

4.扔给QA继续测试……23333333333333333333333

Spring Authorization Server自定义密码模式:突破标准OAuth2限制,实现MFA与复杂业务集成 OAuth 2.0授权框架是构建现代应用安全体系的基石,其密码模式(Resource Owner Password Credentials Grant)提供了一种直接的资源所有者凭证交换令牌的机制。该模式的核心原理是客户端收集用户密码并直接向授权服务器请求访问令牌,适用于受信任的客户端场景。在技术价值上,它简化了某些传统应用的OAuth集成流程。然而,标准实现往往难以满足复杂的现实业务需求,例如需要集成多因素认证(MFA)、对接外部LDAP目录服务或执行自定义密码加密校验等场景。Spring Authori 阅读详情

相关推荐

Multisim实战:从零搭建体温检测报警电路(附完整仿真文件+调试技巧)

本文详细介绍了如何使用Multisim从零搭建体温检测报警电路,涵盖LM35温度传感器、LM358运算放大器等核心器件的选型与连接,以及信号调理、阈值比较和数码管显示等关键电路设计。附赠完整仿真文件和实用调试技巧,帮助电子工程初学者快速掌握体温温度检测系统的设计与实现。

weixin_28285943的博客 293

黑马程序员——IOS学习笔记(MRC内存管理)

-----------android培训、java培训、IOS学习型技术博客、期待与您交流!------------  OC中提供MRC(MannulReference Counting)和ARC(Automatic Reference Counting),两种内存管理机制 MRC:手动内存管理;ARC:自动内存管理 内存管理的对象:所有继承了NSObject的对象,基本数据类型

u012386336的博客 443

MMORPG网络游戏开发之任务系统的架构与设计

在网路游戏中做任务已经成为游戏很重要的一个核心功能和玩法,如何做好一个灵活可扩展的任务系统的架构与设计,今天来给大家分享一些我们的设计经验。接下来我把整个的任务系统分成以下6个模块:对于单机游戏而言,这6个模块都放在客户端直接处理,对于网路游戏而言,模块1~5实现在服务端,模块6实现在客户端。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习unity的零基础小白,也有一些正在从事unity开发的技术大佬,欢迎你来交流学习。...

voidinit的专栏 3049

手动内存管理转ARC项目实战

在ARC之前,iOS内存管理无论对资深级还是菜鸟级开发者来说都是一件很头疼的事。我参加过几个使用手动内存管理的项目,印象最深刻的是一个地图类应用,由于应用本身就非常耗内存,当时为了解决内存泄露问题,每周都安排有人值班用Instruments挨个跑功能,关键是每次都总能检查出来不少。其实不管是菜鸟级还是资深级开发者都避免不了写出内存泄露的代码,规则大家都懂,可是天知道什么时候手一抖就少写了个rele

changcunyuan的专栏 571

扫地机器人解决方案:工作原理与硬件构成

房间里柜子,鞋子,床,座椅,人都在什么地方?3、数字信号处理器。这主要是为控制芯片进行路径规划后,下发指令给执行的电机,包括舵轮(扫地机人前进,转向的轮子),扫地刷的电机,吸尘器的电机,让这些电机工作。扫地机器人的大脑主要用来规划路径,避障,以及人机交互,例如:人类设定打扫范围,以及语音指导扫地机器人进行打扫,都需要处理器进行处理后,将指令下发到执行机构。小脑属于跟执行层最近的控制区域,例如我们上面说的,后面两个处理器:数字信号处理器和微控制器都是对执行层(电机),进行控制和回馈外部信息的处理器。

迷途 7403

QGIS v3.28 高效加载OSM在线地图的三种实用方法

本文详细介绍了在QGIS v3.28中高效加载OSM在线地图的三种实用方法:通过XYZ Tiles直接连接、使用QuickMapServices插件以及配置WMS/WTMS服务。针对每种方法提供了具体操作步骤、常见问题解决方案和性能优化建议,帮助用户根据需求选择最适合的方案,提升GIS工作效率。

weixin_29233333的博客 434

黑马程序员 --- 内存管理的MRC和ARC

内存管理的MRC和ARC 内存管理 概念:  由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,个app可用的内存是被限制的,如果一个app使用的内存超过20M,则系统会向该app发送Memory Warning消息。收到此消息后,需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量,否则程序

u013644868的博客 1011

倍福Beckhoff运动控制功能块实战解析:从MC_ReadActualPosition到MC_GearInVelo

本文深入解析倍福(Beckhoff)TwinCAT运动控制功能块,从基础的MC_ReadActualPosition、MC_Power等轴状态读取与使能操作,到MC_MoveAbsolute、MC_MoveRelative等单轴定位指令,并重点剖析了用于动态速度同步的核心功能块MC_GearInVelo在飞锯等场景的应用。文章结合实战经验,详细介绍了齿轮耦合、电子凸轮(MC_CamIn)等高级同步功能的参数配置、调试技巧及常见问题,旨在帮助工程师快速掌握倍福运动控制工具箱,实现复杂的同步工艺。

transformer2023的博客 981

【MRC转化为ARC Objective-C语言】

MRC转化为ARC Objective-C语言

madoca的博客 590

【unity实战】Unity2D TileMap的探究(最简单,最全面的TileMap使用介绍)

之前有人在微信上找我,问了TileMap相关的知识【unity实战】随机地下城生成2——绘制地图Tilemap的使用及一些技巧的使用(含源码)不过写的不是特别不是特别细致,只是简单的用了一下,所有这次特地打算单独写一篇文章,来介绍一下,下次还有人问我,我直接就把这篇文章丢给他,完美!Unity的Tilemap 一般称之为瓦片地图或者平铺地图,是 Unity2017 中新增的功能,主要用于快速编辑 2D 游戏中的场景,通过复用资源的形式提升地图多样性。Tilemap是一个用于创建2D地图的工具。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1万+

FAST-LIVO2 源码精读(十六):接入自定义传感器——多雷达适配与内外参标定

本文是「FAST-LIVO2 激光-惯性-视觉里程计源码精读」专栏第十六篇。上一篇拆解了中每个关键参数的物理含义与调参路径,并反复强调外参RclPcl与时间偏移配错即全局失效;本篇承接这一悬念,回答更前置的工程问题——如何把 FAST-LIVO2 接到一套全新硬件上:新雷达如何通过的类型分支适配、相机内参与畸变模型如何配置、两组外参与时间偏移如何标定出来并填入 YAML,最后给出一份落地检查清单。

PX4-SLAM-PNC 199

MRC到ARC的自动转换

  回 到正题,我们讨论的是ARC,关于REST API和XML解析的技术细节就暂时先忽略吧..整个程序都是用MRC来进行内存管理的,首先来让我们把这个demo转成ARC吧。基本上转换为ARC意 味着把所有的retain,release和autorelease关键字去掉,在之前我们明确几件事情: * Xcode提供了一个ARC自动转换工具,可以帮助你将源码转为AR...

靓靓软件工作室 283

[VT虚拟化驱动]利用EPT实现无痕HOOK

本章利用讲EPT无痕HOOK

吾无法无天的博客 1万+

静态库知识小记

1.静态库简介 1.1.静态库的简介   库就是程序代码的集合,是共享程序代码的一种方式 1.2.库的分类   (1)开源库:公开源代码,能看到具体实现   (2)闭源库:不公开源代码,是经过编译后的二进制文件,看不到具体实现;其中包括:静态库和动态库 1.3.静态库的存在形式   (1).a   (2).framework 1.4.动态库的存在形式   (1)...

lyz0925的博客 293

pscad IEEE标准系统搭建说明

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

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

MRC转ARC(2)

春节前抽空花了一天的时间将手头的工程从MRC转成了ARC,然后陆陆续续地修复一部分因为转ARC引起的内存泄漏和崩溃,到目前为止工程也算是比较稳定了,抽空记上一笔。(虽说这种事情这辈子估计都只会做这么一次了,但是可以留点经验给后来的童鞋) 这个工程启动于12年底13年初,一开始人手少工期短,需要尽快地出demo,同时抱着对面世才一年多的ARC不太信任的态度沿用了最熟悉的MRC。但是随着工程投入的人...

weixin_33711641的博客 161

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

将 MRC 项目转换为 ARC 项目

其实很简单,直接使用系统工具转换即可,以下是步骤: 1. 你之前的项目是MRC的   2. 里面有 release, dealloc 等.   3. 开始转化   4. 点击save转化完后,记得把工程重新设置成arc的.                  ...

weixin_34262482的博客 205

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

实战总结:复杂工程从MRC切换到ARC

对于现在的xcode来说,工程从mrc切换到arc仅需要改一个全局配置而已。介绍一下笔者面临的情况:大部分业务代码通过-fobjc-arc手动标签添加,运行在arc模式下;大约有大几百个文件,是一个遗留的中间件,运行在mrc下。项目有3个target,.m和.mm文件一共有约2千个。那么问题就很明确了,我们需要把之前的arc标签去掉,然后所有的mrc代码加上-fno-objc-arc即可实现目标。

openglnewbee的博客 3206

非ARC和ARC项目互转

工程->target->Build Phases->Compile Sources 对相应的文件添加:-fobjc-arc参数

xyxjn的专栏 2392

转向ARC实际操练

这是紧接上一篇ARC介绍的文字,原创作者通过一个实例,讲述了如何从现有的非ARC项目转向ARC项目,值得大家学习。 具体操作 说了这么多,终于可以实践一下了。在决定使用ARC后,很多开发者面临的首要问题是不知如何下手。因为可能手上的项目已经用MRC写了一部分,不想麻烦做转变;或者因为新项目里用ARC时遇到了奇怪的问题,从而放弃ARC退回MRC。这都是常见的问题,而...

weixin_33937499的博客 206

MRC转ARC注意事项和存在的问题

转载请注明出处: 1.删除所有retain,release和autorelease。 2.把原来property写retain和assign的地方替换成strong或者weak. 3.MRC需要自己retain一个想要保持的对象,而现在不需要了。现在唯一要做的是用一个指针指向这个对象,只要指针没有被置空,对象就会一直保持在堆上。当将指针指向新值时,原来的对象会被relea

... 3053

ARC, MRC 的混编

1. ARC & MRC 混合开发 在项目开发中,遇到使用MRC开发的第三方库怎么办? 例如:ASI 1> 尝试使用Xcode的转换工具(失败率比较高) 2> 在编译选项中,为MRC的程序添加-fno-objc-arc标记,表明在编译时,该文件使用MRC编译 备注: (1) 演示中使用的RegexKitLite还需要导入libicucore.dylib动

strong90的博客 523

内存管理之MRCARC

文章目录内存管理(引用计数)自己生成的对象,自己所持有非自己生成的对象,自己也能持有不再需要自己持有的对象就将其释放自己生成并持有的对象非自己生成并持有的对象注意非自己持有的对象无法释放释放两次本就不持有retainCountautorelease使用方法适用场景其他方法showPoolsARC自动引用计数所有权修饰符__strong修饰符__weak修饰符__unsafe_unretained修饰符__autoreleasing修饰符一些规则ARC有效时,不能使用retain或者release遵守命名规则

吃橘子 811

MRC转ARC注意事项和存在的问题修改版

注意事项: 1.删除所有retain,release和autorelease。 2.把原来property写retain和assign的地方替换成strong或者weak. 3.dealloc并没有做除了release和super dealloc之外的任何事情,直接删除整个delloc方法就可以了。 4.不使用ARC的文件,在Build Phases-Compile Sources的文件中

... 5238

iOS项目MRC转ARC的两种方法

由于公司项目过于老旧,内存还是使用mrc进行管理,导致出现不少问题,最近着手将项目由mrc转换到arc上来,本人初步想法,有两种方案实施: 一、第一种方案(一步到位) 1、过滤无需转换的文件(需要统计出不需要转换的文件及第三方做标记) 不希望转换的文件,添加-fno-objc-arc标记; 对于第三方库如果有arc版的进行替换,没有的添加-fno-objc-arc标记; 2、使用Xcode自...

weixin_34144450的博客 388

将项目改为MRC的方法(有图有真相)

跟着图的顺序肯定没有问题。 1、首先先选中工程文件。 2、选中TARGETS中选中需要更改的项目。 3、选中bulidSeting。 4、在搜索框中搜索“auto”。 5、在Automatic Reference Counting 将YES改为NO。

帅气如我丶的博客 6011
上一篇: MKNetworkKit: 网络处理又一利器
下一篇: ios6前后分别如何处理内存警告
夏草away
博客等级 码龄16年 15粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值