MRC工程转ARC工程小记

出现Command ‘vim‘ is available in the following places,vim: command not found等解决方法 内置命令无法识别,说明系统变量有误,导致无法识别,既然系统变量有误,将其注释或者更改为正确的即可,但是现在打不开,又怎么注释掉。替换vim来打开编辑,打开之前错误的全局变量文件,发现变量有误,要么注释要么改为。系统变量有全局变量(通过命令行printenv或者echo)和局部变量。对应通过vim修改错误的变量文件,不然source也无法让配置文件生效。本身vim是系统内置的命令,连vim都出现问题。修改为正确的即可,之后还需要重启服务器,使用。之后即可成功,通过即可查看命令是否有写入。... 阅读详情

转自:阿毛的蛋疼地 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

YOLO小目标检测优化:9种实用方案,准确率直接提升15% 小目标检测是个系统工程,没有银弹,但有明确的优化路径。优先搞数据。Copy-Paste + 提升分辨率,这俩加起来成本最低、收益最大,能解决80%的小目标问题。别一上来就改模型结构。调参走在改结构前面。锚框聚类、损失加权、增强优化,这些都是零成本的,先做满了再说改模型的事。P2层是大杀器,但不要轻易用。加了P2层,TensorRT部署、后处理、速度都要跟着调,工程化工作量翻倍。数据和训练做到位还不够,再加也不迟。滑动窗口是兜底的。能从训练端解决的问题,就不要拖到推理端。 阅读详情

相关推荐

AI提示词设计中的批判性思维训练方法

在人工智能应用中,提示词(prompt)设计是影响生成内容质量的关键因素。通过引入批判性思维框架,可以有效提升AI输出的逻辑性和多样性。该方法基于目的澄清、证据评估、假设检验和多视角分析四大支柱,构建结构化的问题拆解和证据链。在学术论文辅助写作、商业决策模拟等场景中,这种训练方式能显著提高内容质量,特别适合学生、职场人士和内容生产者。结合思维可视化工具和本地知识库,可以实现从基础应用到专家级分析的进阶。

weixin_33624741的博客 229

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

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

u012386336的博客 443

BUUCTF逆向题Youngter-drive

其实线程一代码我自己也不大理解,看了正确的 flag 后,我自己推出来的是这样:在 couece 中取出字符,然后在 QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm 中找出一样的,取出该字符在 QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm 中的下标,如果取出的字符是大写则 在ASCII中找出【下标 - 38】值对应的字符替换couece中的字符,同理,小写就减 96。

于高山之巅,方见大河奔涌;于群峰之上,更觉长风浩荡。 1093

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

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

changcunyuan的专栏 571

NXP ChessDE的安装和激活

如果客户申请的是试用版,那么一份为期 30 天的 License 将会发送申请人的账号或邮箱中,客户使用该文件进行安装即可。② 将“VENDOR snpslmd /path/to/snpslmd”中的“/path/to/snpslmd”替换成 snpslmd.exe 实际存放路径(位于 SCL 安装目录下的 win32\bin 文件夹中,默认安装的情况下就是“VENDOR snpslmd C:\Synopsys\SCL\<version>\win32\bin\snpslmd.exe”)。

weixin_47351160的博客 2045

细胞膜电学特性的分数阶微积分建模

分数阶微积分在细胞膜电学特性建模中的应用主要体现在对细胞膜的电容行为和神经元放电活动的更精确描述上。

冰河世纪20的博客 623

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

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

u013644868的博客 1011

Android影像系统架构专家面试指南

传音控股招聘影像系统架构专家,要求8年以上开发经验,5年架构设计经验,精通Android Camera开发及性能优化。该职位需负责手机影像软件架构设计、技术选型及跨平台适配,重点解决"快稳省"体验优化。面试评估聚焦三大维度:技术方面考察HAL层架构设计、多帧合成优化等能力;系统开发关注低光降噪等场景的算力平衡;团队管理侧重跨部门协作与项目交付。候选人需展现对CamX-CHI等架构的深入理解,具备量化分析性能指标的能力,并能主导旗舰机影像项目全周期落地。

郑伟强dev的专栏 944

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

MRC转化为ARC Objective-C语言

madoca的博客 590

基于单片机设计的智能消防排烟窗控制系统_422

随着城市化进程的不断加快,高层建筑、大型商业综合体以及地下空间的数量迅速增加,建筑内部结构日趋复杂,一旦发生火灾,烟雾和有毒气体往往比明火更具威胁性。大量研究表明,在火灾事故中,人员伤亡的主要原因并非直接烧伤,而是由于吸入烟雾及一氧化碳等有毒气体导致窒息。因此,如何在火灾初期快速排烟、降低有害气体浓度,并及时进行预警,成为现代消防系统设计中的关键问题。传统的消防排烟系统多依赖人工操作或简单的联动控制方式,存在响应滞后、自动化程度低、信息反馈不及时等问题。在实际应用中,当火灾发生时,如果不能第一时间开启排烟窗

397

2023年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题4)-网络部分解析-附详细代码

2023年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题4)-网络部分解析-附详细代码

bfq05234214的博客 441

MRC到ARC的自动转换

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

靓靓软件工作室 283

基于STM32单片机智能循迹小车毕业设计

本文介绍了一种利用STM32F103C8T6单片机为控制核心,结合多种传感器以及PID算法实现循迹避障功能的智能小车。随着我国高科技水平的不断提高和工业自动化进程的不断推进,智能小车被广泛应用于各种玩具和其他产品的设计中,极大地丰富了人们的生活。本次设计利用反射式红外光电传感器探测路面黑线实现小车循迹,利用超声波测距传感器探测路径上的障碍,控制小车自动避障,整个系统具有自动循迹、自动避障、速度检测和无线遥控功能。其中,控制部分采用STM32F103C8T6单片机,STM32F103C8T6单片机是一

qq_48771816的博客 3974

静态库知识小记

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

lyz0925的博客 293

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

MRC转ARC(2)

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

weixin_33711641的博客 161

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

将 MRC 项目转换为 ARC 项目

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

weixin_34262482的博客 205

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

实战总结:复杂工程从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、付费专栏及课程。

余额充值