您的位置:首页 > 移动开发 > IOS开发

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

2015-08-25 22:12 573 查看
自定义警报框下载地址

先看看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 /*<UIAlertViewDelegate>*/)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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息