摘要
對(duì)于可變參數(shù)這種什么va_list之類的東西单默,很多人會(huì)覺得很陌生碘举,其實(shí)這個(gè)一點(diǎn)都不陌生,反而說(shuō)很是熟悉搁廓。奇怪吧引颈,舉個(gè)你立馬恍然的例子,UIAlertView的init方法中otherButtonTitles:(NSString*)otherButtonTitles, ...境蜕,這就是可變參數(shù)蝙场。是不是頓時(shí)恍然,那咱們就具體的來(lái)說(shuō)下這個(gè)可變參數(shù)的使用汽摹。
原理
在VC++6.0的include有一個(gè)stdarg.h頭文件,有如下幾個(gè)宏定義:
#define _INTSIZEOF(n)?? ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )?????????? //第一個(gè)可選參數(shù)地址
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //下一個(gè)參數(shù)地址
#define va_end(ap)??? ( ap = (va_list)0 )??????????????????????????? // 將指針置為無(wú)效
使用
VA_LIST 是在C語(yǔ)言中解決變參問題的一組宏
VA_LIST的用法:
(1)首先在函數(shù)里定義一具VA_LIST型的變量李丰,這個(gè)變量是指向參數(shù)的指針
(2)然后用VA_START宏初始化變量剛定義的VA_LIST變量,這個(gè)宏的第二個(gè)參數(shù)是第一個(gè)可變參數(shù)的前一個(gè)參數(shù)逼泣,是一個(gè)固定的參數(shù)趴泌。
(3)然后用VA_ARG返回可變的參數(shù),VA_ARG的第二個(gè)參數(shù)是你要返回的參數(shù)的類型拉庶。
(4)最后用VA_END宏結(jié)束可變參數(shù)的獲取嗜憔。然后你就可以在函數(shù)里使用第二個(gè)參數(shù)了。如果函數(shù)有多個(gè)可變參數(shù)的氏仗,依次調(diào)用VA_ARG獲取各個(gè)參數(shù)吉捶。
(PS:哈哈哈,是不是很專業(yè)皆尔,感覺13裝的太過了呐舔,原理和上面的使用是網(wǎng)上copy來(lái)的)
我覺得原理和使用寫的很通俗,至少我這樣的理解能力都理解了慷蠕!
慣例:
寫段簡(jiǎn)單的具體使用的代碼給大家看看珊拼,加深理解和學(xué)會(huì)應(yīng)用
- (void)mutableParamList:(NSString*)firstPara,...
{
va_list arguments;
id eachObject;
if(firstPara) {
NSLog(@"1:%@",firstPara);
va_start(arguments, firstPara);
while((eachObject =va_arg(arguments,id))) {
NSLog(@"2:%@",eachObject);
}
va_end(arguments);
}
}
===================
調(diào)用:[selfmutableParamList:@"aaaa",@"bbbb",@"cccc",@"dddd",nil];
===================
很多時(shí)候?qū)懸恍┩ㄓ玫臇|西的時(shí)候可以用到這個(gè),比如說(shuō)倉(cāng)管系統(tǒng)流炕,你要搜索出多種不同條件的貨物澎现,你可以用此方法傳多個(gè)條件參數(shù)仅胞,寫一個(gè)通用的方法返回你的貨物。不過也有很多替代方法剑辫, 比如把多個(gè)參數(shù)放入數(shù)組傳值也是可以的干旧。看自己選擇啦妹蔽,哈哈椎眯!