ios-ARC和MRC混编问题

有的时候我们可能会需要做到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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值