Write In Frist:今天检测内存泄漏的时候,打算在我们的项目中集成下MLeaksFinder传送门使用。
先天条件:我们的App今年第五年了,从来没有使用Pod。一些第三方SDK都是单独集成的。
集成遇到的问题:
一、Target中的一些设置,CocoaPods 也做了默认的设置,如果两个设置结果不一致,就会造成如下警告。示例如下:
报错信息修改方法:最直接的就是在对应项中添加一个字段 $(inherited)
$(inherited) 百度了下字面意思是:继承的。实际上的含义,目前的理解是:继承自更高一级的配置。SO传送门
看到网上有提及说直接清空整个对应项的配置字段。因为我们的项目有一些其他SDK配置,这种方法明显不可取。经过验证,添加$(inherited)可以在不改动原有配置的情况下,修复这个警告。
1.1红色下划线标记了Debug 和 Release版本。说明两个配置项都需要修改。
1.2、碰到的几种对应项
-
HEADER_SEARCH_PATHS
对应需要修改:Target -> Build setting -> Header Search Paths项目。
-
GCC_PREPROCESSOR_DEFINITIONS
对应需要修改:Target -> Build setting ->Preprocessor Macros
-
OTHER_LDFLAGS
对应需要修改:Target -> Build setting ->Other linker flags
-
OTHER_CFLAGS
对应需要修改:Target -> Build setting ->Other c flags
-
OTHER_CPLUSPLUSFLAGS
对应需要修改:Target -> Build setting ->Other c++ flags
最后一项我没有碰到,但是我为了以防万一,直接添加了。
二、编译报错文件丢失
文件丢失自己单独写一个小demo编译没有问题。而我的项目却编译失败。针对性的去搜索了也没有解决。最后对比demo。发现pod下的.a文件都爆红,未进行编译。拿demo的针对性替换也不行。毕竟libPods.a无法替换。好在发现了问题根源。
解决办法:Target -> Build setting ->Build Active Architecture Only 属性。设置debug项为YES。<如果你的是no,替换为YES进行尝试>。
Build Active Architecture Only含义:
这个属性设置为yes,是为了debug的时候编译速度更快,它只编译当前的architecture版本。
而设置为no时,会编译所有的版本。
这个是设备对应的architecture:
armv6: iPhone、iPhone 2、iPhone 3G、iPod Touch(第一代)、iPod Touch(第二代)
armv7: iPhone 3Gs、iPhone 4、iPhone 4s、iPad、iPad 2
armv7s: iPhone 5、iPhone 5c (静态库只要支持了armv7,就可以在armv7s的架构上运行)
arm64(注:无armv64): iPhone 5s、iPhone 6、iPhone 6 Plus、iPhone 6s、
iPhone 6s Plus、iPad Air、iPad Air2、iPad mini2、iPad mini3
编译出的版本在cpu内核结构向下兼容的,比如你设置此值为yes,用iphone4编译出来的是armv7版本的,iphone5也可以运行,因为armv7s兼容armv7。但是armv6的设备就不能运行。
所以,一般debug的时候可以选择设置为yes,release的时候要改为no,以适应不同设备。
网友评论