如果在定義方法時(shí),在最后一個(gè)形參明后增加逗號(hào)和三點(diǎn)(,...),則表明該形參可以接受多個(gè)參數(shù)值。
為了在程序中獲取個(gè)數(shù)可變的形參,需要使用如下關(guān)鍵字
· va_list:這是一個(gè)類型,用于定義指向可變參數(shù)列表的指針變量
· va_start:這是一個(gè)函數(shù),該函數(shù)指定開(kāi)始處理可變形參的列表,并讓指針變量指向可變形參列表的第一個(gè)參數(shù)
· va_end:結(jié)束處理可變形參,釋放指針變量
· va_arg:該函數(shù)返回獲取指針當(dāng)前指向的參數(shù)的值,并將指針移動(dòng)到指向下一個(gè)參數(shù)
例子
Varargs.h
#import <Foundation/Foundation.h>@interface Varargs : NSObject//定義形參個(gè)數(shù)可變的方法-(void)test:(NSString *)name,...;@end
Varargs.m
#import "Varargs.h"@implementation Varargs-(void)test:(NSString *)name,...{ // 使用va_list定義一個(gè)argList指針變量,該指針變量指向可變參數(shù)列表 va_list argList; // 如果為第一個(gè)name參數(shù)存在,才需要處理后面的參數(shù) if (name) { // 由于name參數(shù)并不在可變參數(shù)列表中,因此先處理name參數(shù) NSLog(@"%@" , name); // 讓argList指向第一個(gè)可變參數(shù)列表的第一個(gè)參數(shù),開(kāi)始提取可變參數(shù)列表的參數(shù) va_start(argList, name); // va_arg用于提取argList指針當(dāng)前指向的參數(shù),并將指針移動(dòng)到指向下一個(gè)參數(shù) // arg變量用于保存當(dāng)前獲取的參數(shù),如果該參數(shù)不為nil,進(jìn)入循環(huán)體 NSString* arg = va_arg(argList, id); while (arg) { // 打印出每一個(gè)參數(shù). NSLog(@"%@",arg); // 再次提取下一個(gè)參數(shù),并將指針移動(dòng)到指向下一個(gè)參數(shù) arg = va_arg(argList, id); } // 釋放argList指針,結(jié)束提取 va_end(argList); }}@end
main函數(shù)
int main(int argc, const char * argv[]){ @autoreleasepool { Varargs* va = [[Varargs alloc] init]; [va test:@"瘋狂iOS講義" , @"瘋狂Android講義", @"瘋狂Ajax講義" , nil]; } return 0;}
注意:個(gè)數(shù)可變的形參只能處于形參列表的最后。一個(gè)方法中最多之恩給你保吉安一個(gè)長(zhǎng)度可變的形參。
引自《瘋狂iOS講義(上)》
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注