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

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

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

你可能感兴趣的:(实战总结:复杂工程从MRC切换到ARC)