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

简介: 对于现在的xcode来说,工程从mrc切换到arc仅需要改一个全局配置而已。介绍一下笔者面临的情况:大部分业务代码通过-fobjc-arc手动标签添加,运行在arc模式下;大约有大几百个文件,是一个遗留的中间件,运行在mrc下。

对于现在的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();

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

目录
相关文章
|
2月前
MFC编程 -- 运行窗口居中显示
MFC编程 -- 运行窗口居中显示
16 0
|
2月前
MFC编程 -- 添加菜单
MFC编程 -- 添加菜单
9 0
|
3月前
|
Swift iOS开发 开发者
IOS开发基础知识:什么是 ARC(自动引用计数)?如何工作?
IOS开发基础知识:什么是 ARC(自动引用计数)?如何工作?
46 1
|
存储 数据可视化 NoSQL
Qt Creator的CDB调试器--使用技巧与解决调试很慢的心得,重点是Symbols Path设置
Qt Creator的CDB调试器--使用技巧与解决调试很慢的心得,重点是Symbols Path设置
2230 0
Qt Creator的CDB调试器--使用技巧与解决调试很慢的心得,重点是Symbols Path设置
SAP RETAIL初阶之事务代码MP83 显示一个预测参数文件
SAP RETAIL初阶之事务代码MP83 显示一个预测参数文件
SAP RETAIL初阶之事务代码MP83 显示一个预测参数文件
|
小程序 编译器 C++