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

本文介绍了如何通过Python脚本自动批量修改Xcode工程中的MRC到ARC转换,包括标记和移除代码标签的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于现在的xcode来说,工程从mrc切换到arc仅需要改一个全局配置而已。

介绍一下笔者面临的情况:大部分业务代码通过-fobjc-arc手动标签添加,运行在arc模式下;大约有大几百个文件,是一个遗留的中间件,运行在mrc下。项目有3个target,.m和.mm文件一共有约2千个。

那么问题就很明确了,我们需要把之前的arc标签去掉,然后所有的mrc代码加上-fno-objc-arc即可实现目标。

但是这里有这么多文件,手动在xcode里面打标签显然是不可能的;那么我们需要挖掘xcode工程文件的格式,从而达到我们批量自动修改的目的。

关于xcode工程文件格式,这里就不展开了,实际也比较简单,大家创建一个例子工程用文本工具打开自己研究一番也就弄明白了,这里给一个技术文章的链接:

http://blog.csdn.net/openglnewbee/article/details/51067497


笔者这里选取了python用作文本文件的处理,处于方便考虑,分两步完成上面的任务。

step1:给原工程文件所有使用mrc的.m或.mm打上-fno-objc-arc标签

step2:给step1结果文件中有的-fobjc-arc标签全部去掉。


上代码(脚本技术很渣,见谅):

addNoARCFlag.py:

oldFile = open('/Users/achen/Desktop/testScript/test1.pbxproj', 'rb')
newFile = open('/Users/achen/Desktop/testScript/test1New.pbxproj', 'w')

for line in oldFile:
    if (line.find('.m */;') == -1 and line.find('.mm */;') == -1) or line.find('isa = PBXBuildFile') == -1:
        print('not .m or .mm PBXBuildFile, no changes to it.');
    else:
        print('find .m or .mm PBXBuildFile');
        if line.find('-fobjc-arc') == -1:
            # insert arc flag
            line = line.replace('.m */;', '.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; };')
            line = line.replace('.mm */;', '.mm */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; };')
            print(line)
        else:
            print('already have arc flag')
    newFile.write(line)

newFile.flush();

oldFile.close();
newFile.close();


removeARCFlag.py:

oldFile = open('/Users/achen/Desktop/testScript/test1New.pbxproj', 'rb')
newFile = open('/Users/achen/Desktop/testScript/test1Final.pbxproj', 'w')

for line in oldFile:
    if (line.find('.m */;') == -1 and line.find('.mm */;') == -1) or line.find('isa = PBXBuildFile') == -1:
        print('not .m or .mm PBXBuildFile, no changes to it.');
    else:
        print('find .m or .mm PBXBuildFile');
        if line.find('-fobjc-arc') != -1:
            # remove arc flag
            line = line.replace('.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; };', '.m */;')
            line = line.replace('.mm */; settings = {COMPILER_FLAGS = "-fobjc-arc"; };', '.mm */;')
            print(line)
    newFile.write(line)

newFile.flush();

oldFile.close();
newFile.close();

然后将工程文件替换到项目里面运行即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值