某天,开发小王:来帮忙看下,为什么我的按钮样式变了,我什么代码都没改。源码调试没问题,二进制组件工程有问题。
看了下代码,按钮的生成是一个工厂方法,通过传入不同的枚举值(比如:BUTTON_STYLE_DELETE
)返回不同的按钮样式,方法的实现在一个基础组件A中,出问题的组件B依赖了这个基础组件A。其中枚举定义示例如下:
typedef NS_ENUM(NSUInteger, BUTTON_STYLE) {
BUTTON_STYLE_DEFAULT,//默认
BUTTON_STYLE_FAV ,//收藏
BUTTON_STYLE_DELETE,//删除
BUTTON_STYLE_ADD,//加
};
以上代码可能出问题的也就是枚举值了,查看了下这个基础组件的提交记录后发现 BUTTON_STYLE_DELETE
前面被插入了新的值 BUTTON_STYLE_BACK
:
typedef NS_ENUM(NSUInteger, BUTTON_STYLE) {
BUTTON_STYLE_DEFAULT,//默认
BUTTON_STYLE_FAV ,//收藏
BUTTON_STYLE_BACK,//返回
BUTTON_STYLE_DELETE,//删除
BUTTON_STYLE_ADD,//加
};
造成在组件A中 BUTTON_STYLE_DELETE
值变成了3,而组件B中的 BUTTON_STYLE_DELETE
值还是2。枚举值在组件B被编译成静态库时就已经被赋值了,还是之前的值。所以获取到的按钮样式自然有问题。所以在组件化工程中特别是公共组件对枚举做增删操作时一定不要改变原有的值。在组件化工程中除了枚举这种编译期赋值,还有在预编译期赋值的, 如宏定义也是经常出问题的地方,比如公共组件更改了宏定义的值,依赖的组件也需要重新打包。