变更记录

序号 录入时间 录入人 备注
1 2016-09-19 Alfred Jiang -
2 2017-04-09 Alfred Jiang 更新 CSDN - iOS编译过程的原理和应用 相关

方案名称

Xcode - 系统警告处理(清除和添加)

关键字

Xcode \ 添加警告 \ 清除警告 \ Warning

需求场景

  1. 消除系统中的编译警告

参考链接

  1. CocoaChina - 怎么去掉Xcode工程中的某种类型的警告
  2. 董铂然的博客 - iOS警告收录及科学快速的消除方法(推荐)
  3. CSDN - iOS编译过程的原理和应用(推荐)
  4. Which Clang Warning Is Generating This Message?
  5. NSHipster - attribute
  6. CSDN - iOS 合理利用Clang警告来提高代码质量

详细内容

可以通过以下三种方式添加警告

1.使用 #warning TODO 在代码中添加逻辑相关警告
2.使用 NS_DEPRECATED_IOS 添加方法版本相关警告
3.使用 __attribtue__ 编译器指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//弃用API,用作API更新
#define __deprecated __attribute__((deprecated))

//带描述信息的弃用
#define __deprecated_msg(_msg) __attribute__((deprecated(_msg)))

//遇到__unavailable的变量/方法,编译器直接抛出Error
#define __unavailable __attribute__((unavailable))

//告诉编译器,即使这个变量/方法 没被使用,也不要抛出警告
#define __unused __attribute__((unused))

//和__unused相反
#define __used __attribute__((used))

//如果不使用方法的返回值,进行警告
#define __result_use_check __attribute__((__warn_unused_result__))

//OC方法在Swift中不可用
#define __swift_unavailable(_msg) __attribute__((__availability__(swift, unavailable, message=_msg)))

示例:

1
- (void)sampleWarningMethod __deprecated_msg("Unsafe method");

常见警告以及对应清除方法可以参考推荐链接

如果某警告实在无法清除,但是又不想让它显示,可以加入预编译指令

1
2
3
4
#pragma clang diagnostic push
#pragma clang diagnostic ignored "对应预编译指令"
//这里写出现警告的代码
#pragma clang diagnostic pop

这段代码的作用是

  • 对当前编译环境进行压栈
  • 忽略”对应预编译指令”警告
  • 编译代码
  • 对编译环境进行出栈

关于预编译指令的详细对应关系,可以参考这里

关于 iOS 合理利用 Clang 警告来提高代码质量相关知识,可以参考这里

效果图

(无)

备注

(无)