直接忽略 -Wdeprecated-declarations 警告不可取,但可临时局部屏蔽:用 #pragma clang diagnostic push、ignored "-Wdeprecated-declarations" 和 pop 包围具体调用行,避免全局失效;根本解法是依文档替换弃用 API(如 UIWebView → WKWebView)。

直接忽略 -Wdeprecated-declarations 警告不是好主意,但临时屏蔽它确实可行——前提是你知道自己在绕过什么。
为什么 clang 会报 deprecated declaration
这个警告说明你调用了被标记为“已弃用”的 API,比如 iOS 里已淘汰的 UIWebView、NSDateFormatter 的某些方法,或 C 标准库里的 gets()、strncpy()(不带长度检查的老版本)。Clang 不是凭空警告,而是读取了头文件里类似 __attribute__((deprecated)) 或 [[deprecated]] 的声明。
- 不是编译错误,代码仍能编译通过并运行
- 但该 API 可能在下个系统版本被彻底移除,或存在已知安全/性能问题
- 警告本身不带行号?常见于第三方 SDK 内部调用,需看完整日志定位源头
临时屏蔽:用 #pragma 包住具体调用
只对某几行真正调用弃用 API 的代码生效,不影响其他地方。这是最安全的局部处理方式。
- 必须成对使用:
#pragma clang diagnostic push和#pragma clang diagnostic pop - 中间插入:
#pragma clang diagnostic ignored "-Wdeprecated-declarations" - 不能跨函数、不能包整个实现文件,否则掩盖真实风险
- 示例:
#pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.title"]; #pragma clang diagnostic pop
注意:如果 webView 是 UIWebView * 实例,这里只是压制警告,不代表它还能在 iOS 17+ 正常工作。
全局关闭:Xcode 项目设置里加 -Wno-deprecated-declarations
适用于你确认所有弃用调用都可控,或正在迁移旧项目、暂时无法逐个修复。
- 路径:
Build Settings → Other Warning Flags,双击添加-Wno-deprecated-declarations - 效果:整个 target 下所有
-Wdeprecated-declarations警告消失 - 风险:后续新增的弃用调用也不会提醒,容易遗漏升级点
- CI 构建时若没同步该配置,可能在别处突然报错
真正该做的:查文档找替代方案
压制警告只是止痛,替换 API 才是根治。很多弃用提示里就带推荐写法,比如:
-
UIWebView→ 改用WKWebView,注意 delegate 和加载逻辑差异 -
dispatch_get_current_queue()→ 改用dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) -
CFURLCreateStringByAddingPercentEscapes()→ 改用stringByAddingPercentEncodingWithAllowedCharactersInSet:
关键不是“怎么关掉警告”,而是“哪个新 API 能等价替换,且兼容你支持的最低系统版本”。iOS 12 和 iOS 16 对 WKWebView 的能力支持就有差别,得实测。

















