组件化项目使用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宏,如果一定得暴露,不能修改它们的值。

相关文章
|
2月前
|
JSON Dart 安全
Flutter Dart Macro 宏简化 JSON 序列化
今天我们将会体验 dart 语言新特性 macro 宏,来实现对 json 的序列化,用到的包是官方实验室写的 json 包。 本文将会一步步的带你实现这个功能,那我们开始吧。
Flutter Dart Macro 宏简化 JSON 序列化
|
11月前
|
数据库 容器
SAP EWM 模块中的 pick 和 Pack 功能
SAP EWM 模块中的 pick 和 Pack 功能
|
4月前
|
JavaScript
call、apply、bind的使用场景区分(js的问题)
call、apply、bind的使用场景区分(js的问题)
19 0
|
JSON 前端开发 JavaScript
React(Hook)+TS+axios+ant design+json server实现todolist效果(整体目录结构设计)
React(Hook)+TS+axios+ant design+json server实现todolist效果(整体目录结构设计)
133 0
|
前端开发
前端hook项目pc总结笔记-postgrest方法拼接扩展
前端hook项目pc总结笔记-postgrest方法拼接扩展
91 0
前端hook项目pc总结笔记-postgrest方法拼接扩展
|
JSON 前端开发 数据格式
前端hook项目pc总结笔记-ant design中利用json server模拟请求
前端hook项目pc总结笔记-ant design中利用json server模拟请求
72 0
|
前端开发
前端hook项目pc总结笔记-Ts限制父子组件传值类型
前端hook项目pc总结笔记-Ts限制父子组件传值类型
71 0
|
JavaScript 前端开发
浅谈JS中call()和apply()的区别和用途?
前言: 在JavaScript中,this指向问题一直是一个老生常谈的问题。很多小伙伴应该都知道在js中,this指向哪里通常是在函数调用的时候才确定的,简单来说就是谁调用了函数则this指向谁,当然,这只是狭义的,更加详细的介绍大家可以去看《你不知道的Javascript》这本书。 call()和apply()这两个方法的作用可以简单归纳为改变this指向,从而让我们的this指向不在是谁调用了函数就指向谁。
151 1
浅谈JS中call()和apply()的区别和用途?
|
存储 JavaScript 前端开发
企业级项目开发中的交互式解释器以及global全局定义、Stream流的合理运用和实战【Note.js】
企业级项目开发中的交互式解释器以及global全局定义、Stream流的合理运用和实战【Note.js】