有的时候我们可能会需要做到ARC和MRC混合开发,这个时候我们需要的做的就需要去适配这个MRC了。
首先我们可以想到的是通过Xcode自带的有一个工具可以进行转换,去选择To Objectivie-C ARC 那一栏,这个可以把非ARC的代码转换成ARC,但是这有一个条件,就是当前环境不能是ARC的环境,所以我们应该去切换下项目的环境。
切换项目环境在点击Targets,然后再去点击Build Settings里面去寻找
但是这样做会有个问题,就是这个Xcode自带的工具可以帮我们做文件较少的转换,如果文件比较多就不行了,就会有如下所示的错误弹出
所以我们还有另外一种办法,我们可以在Build Phases中找到Compile Sources中在文件的后面去设置-fno-objc-arc,这样相当于做了一个编译的标记,告诉编译器表示该文件以MRC的形式来编译。如下所示
但是这样的话如果我们文件比较多的,我们需要在每一个文件后面去敲那样的标记,显得很麻烦。所以我们可以采取将其编译成.a的形式,也就是编译成静态库的形式来用,这样就不存在什么ARC还是MRC了。
我们其实还可以直接通过CocoaPods来帮我们导入MRC的框架的话,这样也不会出现即便框架中有release autorelease 也不会报错了。
根据唐巧大神说的CocoaPods的工作原理如下所示,我也简单的记录下
CocoaPods是将所有的依赖库都放到另一个名为 Pods 项目中,然后让主项目依赖 Pods 项目,这样,源码管理工作都从主项目移到了 Pods 项目中。
Pods 项目最终会编译成一个名为 libPods.a 的文件,主项目只需要依赖这个 .a 文件即可
对于资源文件,CocoaPods 提供了一个名为 Pods-resources.sh 的 bash 脚本,该脚本在每次项目编译的时候都会执行,将第三方库的各种资源文件复制到目标目录中。CocoaPods 通过一个名为 Pods.xcconfig 的文件来在编译时设置所有的依赖和参数。
有的时候我们想让一些语句在MRC环境下执行,不要在ARC环境下执行,我们可以这么做,使用条件编译的方式
#if !__has_feature(objc_arc)
NSLog(@"--------");
#endif
还有就是如果我们有在MRC的环境下写好的函数,在函数里面进行创建的,我们一般都要加上一个autorelease,所以我们其实可以用宏定义来节省我们的时间
下面表示如果是ARC就不做任何处理,如果不是就加上对应的autorelease release retain
#if __has_feature(objc_arc)
#define ZX_AUTORELEASE(exp) exp
#define ZX_RELEASE(exp) exp
#define ZX_RETAIN(exp) exp
#else
#define ZX_AUTORELEASE(exp) [exp autorelease]
#define ZX_RELEASE(exp) [exp release]
#define ZX_RETAIN(exp) [exp retain]
#endif
CocoaPods基本操作 http://blog.devtang.com/2014/05/25/use-cocoapod-to-manage-ios-lib-dependency/