组件化项目使用NS_OPTIONS宏的坑

简介: TLDR:项目中有一个SDK向外暴露了NS_OPTIONS宏,我修改了宏的值,导致出现Bug。NS_OPTIONS本质是宏,A组件使用了B组件的NS_OPTIONS,当A组件构建为二进制包时,预编译期会将NS_OPTIONS变量替换为固定的值。一旦B组件修改了NS_OPTIONS的值,A组件就会出现逻辑Bug。具体描述:事情是这样,我开发一个需求,涉及A和B两个模块,它们是独立的二进制组件。A模块

TLDR:

项目中有一个SDK向外暴露了NS_OPTIONS宏,我修改了宏的值,导致出现Bug。NS_OPTIONS本质是宏,A组件使用了B组件的NS_OPTIONS,当A组件构建为二进制包时,预编译期会将NS_OPTIONS变量替换为固定的值。一旦B组件修改了NS_OPTIONS的值,A组件就会出现逻辑Bug。

具体描述:

事情是这样,我开发一个需求,涉及A和B两个模块,它们是独立的二进制组件。A模块有一个NS_OPTIONS,名称是XXPresentationOption,代码如下。

typedef NS_OPTIONS(NSInteger, XXPresentationOption) {
    XXPresentationOptionDefault,
    XXPresentationOptionBlocking,
    XXPresentationOptionLight,
    XXPresentationOptionEnableSwipe
};

我开发B模块时,使用了XXPresentationOptionEnableSwipe判断当前是否开启下拉关闭功能,代码如下。

XXPresentationOption myOption = XXPresentationOptionEnableSwipe

测试时发现有bug,原因是没用bitmast声明NS_OPTIONS,导致options会错误地命中XXPresentationOptionBlocking

if (self.options & XXPresentationOptionBlocking) {
	return;
}

于是,我改为bitmst声明,代码如下。

typedef NS_OPTIONS(NSUInteger, XXPresentationOption) {
    XXPresentationOptionDefault = 0,
    XXPresentationOptionBlocking = 1 << 0,
    XXPresentationOptionLight = 1 << 1,
    XXPresentationOptionEnableSwipe = 1 << 2
};

修改后的逻辑本地测试正常,集成A模块测试却发现有逻辑Bug。本地代码和CI平台代码一样,逻辑却不同,这让我怀疑人生!!!经过一番调试,发现B模块中options的值不对。

代码写的是options = XXPresentationOptionEnableSwipe,但实际上options是XXPresentationOptionBlocking | XXPresentationOptionLight

我对比了改动前后的差异,修改前XXPresentationOptionEnableSwipe3,修改后XXPresentationOptionEnableSwipe4XXPresentationOptionBlocking | XXPresentationOptionLight3,正好是修改前的XXPresentationOptionEnableSwipe

我突然晃过神来,我修改A模块后,并没有重新构建B模块。NS_OPTIONS是宏,所以B模块依赖的XXPresentationOptionEnableSwipe还是修改前的3

总结:

组件要尽量避免对外暴露NS_OPTIONSNS_ENUM宏,如果一定得暴露,不能修改它们的值。

相关文章
|
4月前
|
JavaScript
webpack-devtool选项 --生成source-map便于开发调试(二)
webpack-devtool选项 --生成source-map便于开发调试(二)
92 0
|
11月前
09avalon - vm是如何作用视图
09avalon - vm是如何作用视图
50 0
|
4月前
|
JavaScript
call、apply、bind的使用场景区分(js的问题)
call、apply、bind的使用场景区分(js的问题)
20 0
|
JSON 前端开发 JavaScript
React(Hook)+TS+axios+ant design+json server实现todolist效果(整体目录结构设计)
React(Hook)+TS+axios+ant design+json server实现todolist效果(整体目录结构设计)
135 0
|
存储 JavaScript
tp5源码解析--hook(钩子函数)类详解
tp5源码解析--hook(钩子函数)类详解
272 0
tp5源码解析--hook(钩子函数)类详解
|
XML 自然语言处理 Java
【Lua基础 第5章 】unpack()和pack()、Lua 中的文件 I/O、简单模式下io的部分方法、完全模式下file的部分方法、日期和时间、闭包使用
unpack()和pack()、Lua 中的文件 I/O、简单模式下io的部分方法、完全模式下file的部分方法、日期和时间、闭包使用
764 0
【Lua基础 第5章 】unpack()和pack()、Lua 中的文件 I/O、简单模式下io的部分方法、完全模式下file的部分方法、日期和时间、闭包使用
React+hook+ts+ant design封装一个input和select搜索的组件
React+hook+ts+ant design封装一个input和select搜索的组件
262 0
React+hook+ts+ant design封装一个input和select搜索的组件
|
前端开发
React+hook+ts+ant design封装一个table的组件
React+hook+ts+ant design封装一个table的组件
299 0
React+hook+ts+ant design封装一个table的组件