实战总结:复杂工程从MRC切换到ARC-阿里云开发者社区

开发者社区> 开发与运维> 正文

实战总结:复杂工程从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();

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章