oc的可变参数列表用起来不是一般的麻烦,需要使用va_list va_start va_end va_arg , 还需要各种判断。java中就没这么麻烦,java中可变参数列表会自动转换成一个数组,而且java可以通过调用 数组名.length 来获取数组长度,使用起来非常方便,而且java支持自动装箱拆箱,使用非常方便,下面说一下oc可变参数列表。
先举个例子:
-(void)stringParams:(NSString*)strs ,...{ if(strs){ NSLog(@"str = %@\n",strs); va_list argList; va_start(argList, strs); NSString* str=va_arg(argList, id); while(str){ NSLog(@"%@\n",str); str=va_arg(argList, id); } va_end(argList); } }
MyClass* clz=[[MyClass alloc]init]; [clz stringParams:@"aaa",@"bbb",@"cc",@"d",nil]; NSLog(@"\n\n"); [clz stringParams:@"aaa" ,nil ];
<span style="white-space:pre"> </span><pre name="code" class="objc"> <span style="white-space:pre"> </span>[clz stringParams:@"aaa" ];
2015-09-19 10:16:25.980 testt[938:30177] 2015-09-19 10:16:25.981 testt[938:30177] str = aaa 2015-09-19 10:16:25.981 testt[938:30177] bbb 2015-09-19 10:16:25.981 testt[938:30177] cc 2015-09-19 10:16:25.981 testt[938:30177] d 2015-09-19 10:16:25.981 testt[938:30177] 2015-09-19 10:16:25.981 testt[938:30177] str = aaa 2015-09-19 10:16:25.982 testt[938:30177] 2015-09-19 10:16:25.982 testt[938:30177] str = aaa 2015-09-19 10:16:25.982 testt[938:30177] aaa 2015-09-19 10:16:25.982 testt[938:30177] <OS_xpc_dictionary: <dictionary: 0x100200000> { count = 51, contents = "/System/Library/Frameworks/CoreData.framework/Versions/A/CoreData" => <uint64: 0x100202450>: 2 "/System/Library/PrivateFrameworks/LanguageModeling.framework/Versions/A/LanguageModeling" => <uint64: 0x100202390>: 2 "/System/Library/Frameworks/OpenDirectory.framework/Versions/A/Frameworks/CFOpenDirectory.framework/Versions/A/CFOpenDirectory<uint64: 0x1002020b0>: 2 "/System/Library/PrivateFrameworks/CommonAuth.framework/Versions/A/CommonAuth" => <uint64: 0x100202000>: 2 "/System/Library/Frameworks/GSS.framework/Versions/A/GSS" => <uint64: 0x100201e20>: 2 "/System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo" => <uint64: 0x100201ce0>: 2 "/System/Library/PrivateFrameworks/MultitouchSupport.framework/Versions/A/MultitouchSupport" => <uint64: 0x100201880>: 2 "/System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate" => <uint64: 0x1002017e0>: 2 "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A/PrintCore" => <uint64: 0x1002014c0>: 2 "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/HIServices" =><uint64: 0x100201300>: 2 "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/ATS" => <uint64: 0x100201160>: 2 "/System/Library/Frameworks/CoreText.framework/Versions/A/CoreText" => <uint64: 0x100201020>: 2 "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/LaunchServices" =<uint64: 0x1002008e0>: 2 "/System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration" => <uint64: 0x100200170>: 2 "/System/Library/Frameworks/ServiceManagement.framework/Versions/A/ServiceManagement" => <uint64: 0x1002024f0>: 2 "/System/Library/Frameworks/SecurityFoundation.framework/Versions/A/SecurityFoundation" => <uint64: 0x100202190>: 2 "/System/Library/Frameworks/IOSurface.framework/Versions/A/IOSurface" => <uint64: 0x100201740>: 2 "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/SpeechSynthesis.framework/Versions/A/SpeechSyn<uint64: 0x100201660>: 2 "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ColorSync.framework/Versions/A/ColorSync" => <uint64: 0x100201230>: 2 "/System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO" => <uint64: 0x1002010c0>: 2 "/System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics" => <uint64: 0x100200f70>: 2 "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices" => <uint64: 0x100200ec0>: 2 "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/DictionaryServices.framework/Versions/A/DictionarySer<uint64: 0x1002009c0>: 2 "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SearchKit.framework/Versions/A/SearchKit" => <uint64: 0x100200750>: 2 "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/OSServices" => <uint64: 0x100200680>: 2 "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/CarbonCore" => <uint64: 0x1002004e0>: 2 "/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit" => <uint64: 0x100200370>: 2 "/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices" => <uint64: 0x1002002c0>: 2 "/System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio" => <uint64: 0x100202240>: 2 "/System/Library/PrivateFrameworks/Heimdal.framework/Versions/A/Heimdal" => <uint64: 0x100201eb0>: 2 "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/QD.framework/Versions/A/QD" => <uint64: 0x100201590>: 2 "/System/Library/PrivateFrameworks/login.framework/Versions/A/Frameworks/loginsupport.framework/Versions/A/loginsupport" => <uint64: 0x100200c90>: 2 "/System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork" => <uint64: 0x1002000d0>: 2 "/System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox" => <uint64: 0x1002022e0>: 2 "/System/Library/Frameworks/OpenDirectory.framework/Versions/A/OpenDirectory" => <uint64: 0x100201f50>: 2 "/System/Library/PrivateFrameworks/DataDetectorsCore.framework/Versions/A/DataDetectorsCore" => <uint64: 0x100200d60>: 2 "/System/Library/PrivateFrameworks/NetAuth.framework/Versions/A/NetAuth" => <uint64: 0x100200bf0>: 2 "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Metadata" => <uint64: 0x1002005b0>: 2 "/System/Library/PrivateFrameworks/AppleVPA.framework/Versions/A/AppleVPA" => <uint64: 0x100201ae0>: 2 "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/LangAnalysis.framework/Versions/A/LangAnalysis<uint64: 0x1002013e0>: 2 "/System/Library/PrivateFrameworks/TCC.framework/Versions/A/TCC" => <uint64: 0x100200e20>: 2 "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/AE" => <uint64: 0x100200820>: 2 "/System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos" => <uint64: 0x100201d80>: 2 "/System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL" => <uint64: 0x100201c40>: 2 "/System/Library/PrivateFrameworks/AppleJPEG.framework/Versions/A/AppleJPEG" => <uint64: 0x100201b90>: 2 "/System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration" => <uint64: 0x100200aa0>: 2 "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/FSEvents.framework/Versions/A/FSEvents" => <uint64: 0x100200410>: 2 "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/vecLib" => <uint64: 0x100201a10>: 2 "/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vImage.framework/Versions/A/vImage" => <uint64: 0x100201940>: 2 "/System/Library/Frameworks/NetFS.framework/Versions/A/NetFS" => <uint64: 0x100200b50>: 2 "/System/Library/Frameworks/Security.framework/Versions/A/Security" => <uint64: 0x100200220>: 2 }>
再看一下基本类型
-(void)mulParam:(int) a ,... { if(a){ NSLog(@" a = %d\n",a); va_list argList; va_start(argList, a); int num=va_arg(argList, int); while(num){ NSLog(@"%d\n",num); num=va_arg(argList, int); } va_end(argList); } }
MyClass* clz=[[MyClass alloc]init]; [ clz mulParam:1,2,3,4,5]; NSLog(@"\n\n"); [ clz mulParam:1,2,3,4,5,nil]; NSLog(@"\n\n"); [ clz mulParam:1,2,3,nil,4,5]; NSLog(@"\n\n"); [ clz mulParam:3,0,1,2];
2015-09-19 10:19:43.207 testt[966:31797] a = 1 2015-09-19 10:19:43.208 testt[966:31797] 2 2015-09-19 10:19:43.209 testt[966:31797] 3 2015-09-19 10:19:43.209 testt[966:31797] 4 2015-09-19 10:19:43.209 testt[966:31797] 5 2015-09-19 10:19:43.209 testt[966:31797] 1606416488 2015-09-19 10:19:43.209 testt[966:31797] 1 2015-09-19 10:19:43.209 testt[966:31797] 1606416512 2015-09-19 10:19:43.210 testt[966:31797] 2015-09-19 10:19:43.210 testt[966:31797] a = 1 2015-09-19 10:19:43.210 testt[966:31797] 2 2015-09-19 10:19:43.210 testt[966:31797] 3 2015-09-19 10:19:43.210 testt[966:31797] 4 2015-09-19 10:19:43.210 testt[966:31797] 5 2015-09-19 10:19:43.210 testt[966:31797] 2015-09-19 10:19:43.210 testt[966:31797] a = 1 2015-09-19 10:19:43.211 testt[966:31797] 2 2015-09-19 10:19:43.211 testt[966:31797] 3 2015-09-19 10:19:43.211 testt[966:31797] 2015-09-19 10:19:43.211 testt[966:31797] a = 3
注意事项:
可变参数最后需添加 nil ,否则可能会出现错误
可变参数不要使用基本类型,否则可能会误把某个参数(如 整型数字 0 )误认为是参数列表结束标记