美文网首页iOS 知识
iOS可变参数va_list

iOS可变参数va_list

作者: SamCheck | 来源:发表于2018-06-08 13:22 被阅读188次

看一下系统UIAlertView里面的一个方法。

- (instancetype)initWithTitle:(nullable NSString *)title
message:(nullable NSString *)message 
delegate:(nullable id /*<UIAlertViewDelegate>*/)delegate 
cancelButtonTitle:(nullable NSString *)cancelButtonTitle 
otherButtonTitles:(nullable NSString *)otherButtonTitles, ... ;

在方法的最尾部有... 省略号用来添加其他弹唱按钮,看一下实现方式。

sys/_types/_va_list.h文件:

#ifndef _VA_LIST_T
#define _VA_LIST_T
#include <machine/types.h> /* __darwin_va_list */
typedef __darwin_va_list va_list;
#endif /* _VA_LIST_T */

stdarg.h文件:

#ifndef __STDARG_H
#define __STDARG_H

#ifndef _VA_LIST
typedef __builtin_va_list va_list;
#define _VA_LIST
#endif
#define va_start(ap, param) __builtin_va_start(ap, param)
#define va_end(ap)          __builtin_va_end(ap)
#define va_arg(ap, type)    __builtin_va_arg(ap, type)

/* GCC always defines __va_copy, but does not define va_copy unless in c99 mode
 * or -ansi is not specified, since it was not part of C90.
 */
#define __va_copy(d,s) __builtin_va_copy(d,s)

#if __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L || !defined(__STRICT_ANSI__)
#define va_copy(dest, src)  __builtin_va_copy(dest, src)
#endif

#ifndef __GNUC_VA_LIST
#define __GNUC_VA_LIST 1
typedef __builtin_va_list __gnuc_va_list;
#endif

#endif /* __STDARG_H */
-(void)function:(NSString*)value,...{
    va_list argumentList;
    va_start(argumentList, value);
    NSString *tmp = nil;
    
    while ((tmp = va_arg(argumentList, NSString *))) {
        NSLog(@"%@",tmp);
    }
    
    va_end(argumentList);
}

调用:

[self function:@"1",@"2",@"3",nil];

打印:

2
3

参数列表传入方法中,通过遍历argumentList数组获得少一个1,所以va_list获取的数据包含第一位数据,使用时注意。

相关文章

  • va_list 可变参数用法及定义

    可变参数用法 上面是va_list的具体用法,下面讲解一下va_list各个语句含义和 va_list的实现。可变...

  • iOS可变参数va_list

    看一下系统UIAlertView里面的一个方法。 在方法的最尾部有... 省略号用来添加其他弹唱按钮,看一下实现方...

  • IOS可变参数(va_list)

  • C传递可变参数

    C传递可变参数 va_list   va_list配合va_start/va_arg/va_end宏定义, 可以完...

  • iOS 可变参数va_list处理

    前言 某些特殊情况需要传不确认个数的变量会用到va_list来处理。我google了一下va_list文章,都是千...

  • iOS可变参数(va_list)处理

    编写一些通用类的时候经常会遇到可变参数的处理。就好比 :UIAlertView的init方法中的otherButt...

  • C/C++可变参数

    C/C++中支持传递可变参数,即不定参数,例如: 那么如何拿到不定参数,需要借助va_list类型,包含在cstd...

  • va_list 可变参数概览

    前言 VA_LIST 解决变参问题的一组宏,所在头文件:#include ,用于获取不确定个数的参数 比如我们最...

  • iOS可变参数实现及原理剖析

    iOS可变参数实现及原理剖析 标签(空格分隔): iOS可变参数 iOS方法后面为什么有nil参数 你一定会时常见...

  • va_list 可变长参数原理

    在 c 语言中,我们可以使用可变参数来传入多个参数,比如 printf 函数。可变参数的函数需至少定义一个参数值,...

网友评论

    本文标题:iOS可变参数va_list

    本文链接:https://www.haomeiwen.com/subject/kbxasftx.html