[iOS] iOS 多参数函数使用, 例如 NSLog

原文地址-传送门

/**
 日志打印, 多参数列表形式
 
 __attribute__,是GNU编译器的一个特性,这个宏是一个编译器指令,我们在代码中通过定义这个东西,可以提示 编译器我们代码的一些逻辑,从而在编译器避免一些错误,在运行期提高性能。__attribute__在很多代码中都有应用,非常实用。
 
 __attribute__ format ,这个东西能告知编译器,我们的代码在处理printf,scanf这样变参数的函数的时候,哪个参数是format string,哪个参数是参数列表,这样可以避免代码中的一些问题; 编译的时候就能检测

 https://blog.csdn.net/houseq/article/details/38819901
 @param format 格式化字符串
 */
+ (void)log: (NSString *)format, ... NS_FORMAT_FUNCTION(1, 2) {
    
    // 1. 首先创建多参数列表
    va_list args;
    
    // 2. 开始初始化参数, start会从format中 依次提取参数, 类似于类结构体中的偏移量 offset 的 方式
    va_start(args, format);
    NSString *str = [[NSString alloc] initWithFormat:format arguments:args];
    
    // 3. end 必须添加, 具体可参考 ?
    //  http://www.cppblog.com/ownwaterloo/archive/2009/04/21/is_va_end_necessary.html 此链接
    va_end(args);
    NSLog(@"%@",str);

}


/***
 
 NS_FORMAT_FUNCTION(a,b) 函数的意义, ?源码
 
 // NSObjCRuntime.h
 #if !defined(NS_FORMAT_FUNCTION)
 #if (__GNUC__*10+__GNUC_MINOR__ >= 42) && (TARGET_OS_MAC || TARGET_OS_EMBEDDED)
 #define NS_FORMAT_FUNCTION(F,A) __attribute__((format(__NSString__, F, A)))
 #else
 #define NS_FORMAT_FUNCTION(F,A)
 #endif
 #endif
 
 * 其中 a 代表 format 的位置, b 代表 可变参数的位置 
 
 */

#define VALog(FORMAT, ...) [VaList log: FORMAT, ##__VA_ARGS__];


#import <Foundation/Foundation.h>

@interface VaList : NSObject


/**
 多参数打印

 @param format <#format description#>
 */
+ (void)log: (NSString *)format, ... NS_FORMAT_FUNCTION(1, 2) ;

@end

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值