iOS自定义警告框 OC 如何写可变参数的函数

自定义警报框下载地址

先看看OC中的一些用法,一般是在初始化数组的时候, 也可以像下面deotherButtonTitles一样 ,输入一组字符串,以nil结尾,然后输入的字符串就会变成数组了,

UIAlertView *alert = [[UIAlertView alloc]initWithTitle:<#(NSString *)#> 
message:<#(NSString *)#> delegate:<#(id)#> cancelButtonTitle:<#(NSString *)#> 
otherButtonTitles:<#(NSString *), ...#>, nil];
(instancetype)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id /**/)delegate 
cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION 
NS_EXTENSION_UNAVAILABLE_IOS("Use UIAlertController instead.”);

NS_REQUIRES_NIL_TERMINATION :多参数时,末尾带上这个 会以nil结尾。

实现方法,
用到了不定参数
大家先看几宏.
在VC++6.0的include有一个stdarg.h头文件,有如下几个宏定义:

define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )

//整个做的事情就是将n的长度化为int长度的整数倍。
//比如n为5,二进制就是101b,int长度为4,二进制为100b,那么n化为int长度的整数倍就应该为8。
//~(sizeof(int) - 1) )就应该为~(4-1)=~(00000011b)=11111100b,这样任何数& ~(sizeof(int) - 1) )后最后两位肯定为0,就肯定是4的整数倍了。
//(sizeof(n) + sizeof(int) - 1)就是将大于4m但小于等于4(m+1)的数提高到大于等于4(m+1)但小于4(m+2),这样再& ~(sizeof(int) - 1) )后就正好将原长度补齐到4的倍数了。

1.#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) //第一个可选参数地址
2.#define va_arg(ap,t) ( (t )((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //下一个参数地址
3.#define va_end(ap) ( ap = (va_list)0 ) // 将指针置为无效

C语言

void arg_test(int i,...)
{
    int j = 0;
    va_list arg_pp;//定义一个va_list型的变量,这个变量是指向参数的指针

    va_start(arg_pp, i);//得到第一个可变参数的地址,第二个参数是第一个可变参数的前一个参数,是一个固定参数(可以说"..."才是可变参数,int i 只是一个固定的参数,并不是说(int i,...)都是可变参数)
//    arg_pp指向第一个可变参数在堆栈的地址
    printf("1--&i = %p\n",&i);
    printf("2--arg_pp = %p\n",arg_pp);

    j=*((int *)arg_pp);//
    printf("3--%d %d\n", i, j);
    j=va_arg(arg_pp, int);//返回可变的参数,va_arg的第二个参数是你要返回的参数的类型
//    先获取sizeof(int)的类型,让arg_pp指向下一个参数的地址,然后返回arg_pp的指针类型,正式第一个可变参数在堆栈里的地址,然后用*取得这个地址的内容
     printf("4--arg_pp = %p\n", arg_pp);
//
    j=*((int *)arg_pp);
    printf("5--%d %d\n", i, j);
    j=va_arg(arg_pp, int);
    printf("@--arg_pp = %p\n", arg_pp);
    printf("6--%d %d\n", i, j);
    j=va_arg(arg_pp, int);

    printf("@--arg_pp = %p\n", arg_pp);
    va_end(arg_pp);//用va_end结束可变参数的获取,
    printf("6--%d %d\n", i, j);
}

OC

-(NSMutableArray*)test1:(NSString*)firstStr,...NS_REQUIRES_NIL_TERMINATION
{
    NSMutableArray *tempArr = [[NSMutableArray alloc]initWithCapacity:0];
    va_list va_list;
    va_start(va_list, firstStr);
    [tempArr  addObject:firstStr];//添加第一个参数
    id temp;
    //while循环 当取到nil的时候就停止了
    while ((temp = va_arg(va_list, id))) {
        [tempArr addObject:temp];
    }

    return tempArr;
}

你可能感兴趣的:(ios)