Objective-c 可变参数列表缺陷

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 )误认为是参数列表结束标记


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值