objective-c - 可在编译时调整的 Objective-C 框架
问题描述
更详细的解释(对于较小的版本,请查看最后的 TL;DR):
我创建了一个在 Github 上可用的框架。其中,有 7 个宏定义了框架的编译方式。我不能只用static const
's 替换它们,因为其中 6 个宏用于在编译时从框架中删除一些东西。
这些宏可以分为几组:
第 1 组)在可用时使用框架
#define USE_THE_METAL_FRAMEWORK_WHEN_AVAILABLE true
#define USE_THE_OPENGL_FRAMEWORK_WHEN_AVAILABLE true
这些定义使框架使用 Metal 和 OpenGL 框架,即使它们没有被添加到项目中。这是使用dlopen
. 更多详情如下:
我使用它是为了让这些框架只有在可用时才能使用,因此开发人员可以为 macOS 10.6 构建他/她的应用程序,并且如果系统中可用的话,仍然可以使用 Metal。问题是:如果您的应用程序二进制调用dlopen
某处,您不能将它添加到 Apple Store(即使您没有真正使用使用它的函数),因此用户应该能够从代码中删除它,如果他们想。这删除了一些框架功能,但使其能够被提交。
第 2 组)我正在导入框架
#define IM_IMPORTING_THE_METAL_FRAMEWORK false
#define IM_IMPORTING_THE_OPENGL_FRAMEWORK false
这些定义使框架真正使用 Metal 和 OpenGL 框架,而不使用dlopen
. 这样,它可以提交到 Apple Store 并仍然使用前面提到的功能。
组 3) 行为改变
#define USER_NOTIFICATIONS_SHOULD_SHOW_A_BIGGER_ICON true
#define NSDEBUGLOG_SHOULD_PRINT_TO_A_DESKTOP_FILE_TOO true
第一个也可能导致Apple Store出现问题,第二个仅用于调试目的。
最后...
第 4 组)应在 Apple Store 中发布
#define I_WANT_TO_BE_RELEASED_IN_APPLE_STORE false
那个是用来做的:
#if I_WANT_TO_BE_RELEASED_IN_APPLE_STORE == true
#define USER_NOTIFICATIONS_SHOULD_SHOW_A_BIGGER_ICON false
#define USE_THE_METAL_FRAMEWORK_WHEN_AVAILABLE false
#define USE_THE_OPENGL_FRAMEWORK_WHEN_AVAILABLE false
#endif
它会自动禁用可能导致 Apple Store 出现问题的三个定义。
尽管如此,那些使用 Travis-CI 的人仍然无法更改框架,除非他们将其完全复制到项目中。例如,为了解决这个问题(或至少减少它),这 7 个定义中的 5 个可以通过主项目中的文件进行更改。如果有人有其他可以解决问题的建议,我在听。
(可选)如果这可以通过警告用户(通过 Xcode 或编译时错误)的方式完成,他/她需要设置那些很棒的变量,因为这样可以避免用户出现问题可能需要设置那些宏。
TL;DR:是否可以在不修改框架本身的情况下更改框架内某些宏的值?
解决方案
不。做一些方法,用一些参数初始化你的模块。但无论如何你不能使用 dlopen。
推荐阅读
- java - 嵌套循环的大 O 复杂度取决于分数结果的变化
- c# - 使用配置文件中的数据写入事件日志
- excel - 将“K”显示为千位,将“M”显示为百万 Excel
- python - 如何将 CNN 应用于短时傅里叶变换?
- swift - 如何在 OS X 中通过字符串查询搜索文件/文件夹?
- python - 使用频率字典绘制 wordcloud
- kubernetes - 如何确保使用ansible删除POD?
- javascript - Rxjs from() 运算符不发送数据
- javascript - 单击新 div 时禁用其他 div 的样式
- database - MEAN 堆栈:如何在 mongoDB 中存储用户凭据