iOS 自定义 NSLog 和 可变参数

1. 自定义 NSLog

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 声明
void LogD(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
int main(int argc, const char *argv[]) {
LogD(@"Ooops...%d", 1);
}
// 定义
void LogD(NSString *format, ...) {
va_list args;
va_start(args, format);
NSLogv(format, args);
va_end(args);
}

2. 可变参数

1
2
3
4
// Objective-C
- log:(NSString *)format, ... {}
// C
void LogV(NSString *format, ...) {}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void LogV(NSString *format, ...) {
va_list args;
va_start(args, format);
int arg;
// 获取 int 类型参数
while ((arg = va_arg(args, int)) {
NSLog(@"%d", arg);
}
NSString *s;
// 获取 NSString 类型参数
while ((s = va_arg(args, NSString *)) {
NSLog(@"%@", s);
}
va_end(args);
}

3. NS_FORMAT_FUNCTION(F,A)

作用是告诉编译器检查格式化参数类型是否正确,例如:LogD(@"Name: %@", 27) 就会出警告

  • F: Index of format string 格式化字符串的位置
  • A: Index of first argument 格式化参数的起始位置

Exsample

1
2
void LogD(NSString *format, ...) NS_FORMAT_FUNCTION(1,2)
void LogV(BOOL b, NSString *format, ...) NS_FORMAT_FUNCTION(2,3)