代码片段

Objective-C

预编译指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/* 
条件编译,这么做是为了不重复导入相同的头文件内容,减少预编译的时间,Objective-C 中的 #import 关键字,效果和下面的代码一样
*/

#ifndef _PTHREAD_H
#define _PTHREAD_H

// 一些头文件
#include <pthread/sched.h>
// ...

#endif /* _PTHREAD_H */

/*
如果有宏定义 __cplusplus,就进入 ...
*/
#define __cplusplus
#if defined(__cplusplus)
// ...
#endif

// 验证某些特性
#if !__has_feature(objc_arc)
// 如果不支持ARC错误提示且编译不通过
#error "啊 啊 啊~ 伦家需要ARC"
#endif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#if __has_feature(assume_nonnull)
_Pragma("clang assume_nonnull begin")
#endif
__BEGIN_DECLS

__END_DECLS
#if __has_feature(assume_nonnull)
_Pragma("clang assume_nonnull end")
#endif

// 宏定义圆周率,宏定义一般用大写字母表示
#define PI 3.1415926

// 含参数的宏定义,最好带个括号
#define ADD(a, b) (a + b)

// 取消宏定义,则PI的值就不表示其值了
#undef PI

// 宏定义换行 ##代表字符串拼接
#define SINGLE_IMPLEMENTATION(className) static className *instance_; \
\
+ (instancetype)share##className \
{ \
if (!instance_) { \
\
instance_ = [[self alloc] init]; \
} \
\
return instance_; \
}

// 文件包含
#include //有可能引起重复引用问题
#import //不会引起重复引用问题

#if 编译预处理中的条件命令, 相当于C语法中的if语句
#ifdef 判断某个宏是否被定义, 若已定义, 执行随后的语句
#ifndef 与#ifdef相反, 判断某个宏是否未被定义
#elif 若#if, #ifdef, #ifndef或前面的#elif条件不满足, 则执行#elif之后的语句, 相当于C语法中的else-if
#else 与#if, #ifdef, #ifndef对应, 若这些条件不满足, 则执行#else之后的语句, 相当于C语法中的else
#endif #if, #ifdef, #ifndef这些条件命令的结束标志.
#if 与 #ifdef 的区别:#if是判断后面的条件语句是否成立,#ifdef是判断某个宏是否被定义过。要区分开!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 当程序检查到这里时会停止编译,这个命令的作用是在错误的地方禁止编译。
#error 提示的内容

// 这个命令并不会影响程序的编译和运行,但是会认为的在这里显示一条警告信息,提醒我们自己。
#warning

#pragma 参数
// 这个预编译指令是最复杂的,用于控制编译器的行为,一般我们开发应用APP是很少用到的,常用的有两种方式:

#pragma mark - 信息

// 为代码加上标注

#pragma message("信息")

// 编译时提示信息