iOS自定义警告框 OC 如何写可变参数的函数
2015-08-25 22:12
573 查看
自定义警报框下载地址
先看看OC中的一些用法,一般是在初始化数组的时候, 也可以像下面deotherButtonTitles一样 ,输入一组字符串,以nil结尾,然后输入的字符串就会变成数组了,
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语言
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 /*<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; }
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- Android和IOS的浏览器中检测是否安装某个客户端的方法
- javascript实现阻止iOS APP中的链接打开Safari浏览器
- IOS开发第三方语音-微信语音
- iOS开发之路--微博OAuth授权_取得用户授权的accessToken
- ios通过按钮点击异步加载图片
- 加载带有手势识别器的XIB文件需注意哪些问题
- 仅需几行代码实现方便易用的状态栏指示器