1.一般项目的scheme是
Debug
,Release
分别对应debug模式、release模式
2.由于项目接口环境是区分环境的,所以在项目中设置了Debug_dev, Debug_uat, Debug_pro,删掉了默认的Debug模式
问题产生的背景
在Debug_dev
时, 通过cocoapods方式引入的MLeaksFinder
并不生效,排查原因发现MLeaksFinder
有如下代码定义。MLeaksFinder
是根据DEBUG
宏判断是否需要加载,但是在项目内部打印,Debug
为1
//#define MEMORY_LEAKS_FINDER_ENABLED 0
#ifdef MEMORY_LEAKS_FINDER_ENABLED
#define _INTERNAL_MLF_ENABLED MEMORY_LEAKS_FINDER_ENABLED
#else
#define _INTERNAL_MLF_ENABLED DEBUG
#endif
分析原因
-
分析原因:pod模块代码编译链接的时间要先于工程内代码,此时要么是获取不到
DEBUG
的值,要么是此时没有DEBUG
-
排查Project的Build Settings和Pods的Build Settings,发现有个
Preprocessor Macros
的宏,定义了DEBUG=1
,看名字猜测这是一个预定义的宏,用来设置项目中编译前的一些值,这里也就是Debug值的由来之一
cocopods_macro_1
如图,找到问题所在,在Debug_dev模式下并没有所需要的DEBUG=1
,那么我们就需要在这里加上去 -
在
Proprocessor Macros
的Debug_dev
这里手动加上DEBUG=1
是生效了,但是每次pod install之后又被重新覆盖没了。所以这个方法不是可靠的,我们需要在每次pod install触发之后写上DEBUG=1
这个值
解决
- 搜索资料发现Podfile里面可以做自定义配置,如下:
pod 'MLeaksFinder'
post_install do |installer_representation|
installer_representation.pods_project.targets.each do |target|
puts "===================>target name #{target.name}"
if target.name == 'MLeaksFinder'
target.build_configurations.each do |config|
puts "===================>wxq #{config}"
if config.name == 'Debug_dev'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)','DEBUG=1']
end
end
end
end
end
-
然后执行pod install命令,更新配置,效果如下,然后运行项目,OK
cocopods_macro_2
网友评论