Xcode conflicting nullability specifier警告异常行为及库引用触发问题咨询
Objective-C空性声明冲突警告异常问题解答
问题1:重新开启-Wnullability-declspec标识后警告不复现的成因
- 核心原因是Xcode的模块化缓存与增量编译机制:
- 关闭警告标识后编译时,Clang已经生成了无该警告的编译单元缓存,同时如果项目开启了Clang Module,对应头文件的模块缓存会存储首次编译时的配置与检查结果。
- 常规清理项目仅会清除当前项目的构建产物,不会清除Xcode全局的模块缓存(默认路径
~/Library/Developer/Xcode/DerivedData/ModuleCache.noindex),已缓存的模块不会因为修改主项目编译标识就重新编译,因此重新开启标识后不会重新做空性检查,警告自然不出现。 - 部分场景下仅清理了单架构的构建缓存,若切换了模拟器/真机架构,也会出现旧缓存未被清理的情况。
问题2:仅主项目触发库头文件警告、库本身编译无警告的成因
- 有两个核心原因:
- 第一:Clang的警告触发规则是仅对当前编译目标的源文件做完整检查,对外引用的头文件默认抑制警告。你在库的编译配置中加的
-Wnullability-declspec是作用于库的.m源文件编译过程,如果库的源文件没有触发该头文件冲突的代码引用场景,库编译阶段自然不会抛出警告。 - 第二:头文件的语法检查是在引用该头文件的编译单元编译时执行的。主项目引入库的头文件时,主项目开启了该警告标识,且你的自定义库头文件没有被标记为系统头(系统头默认抑制所有警告),因此主项目编译时会检查库头文件的代码,触发警告。
- 第一:Clang的警告触发规则是仅对当前编译目标的源文件做完整检查,对外引用的头文件默认抑制警告。你在库的编译配置中加的
内容的提问来源于stack exchange,提问作者agent.smith
相关产品推荐
相关产品推荐

