IOS之学习笔记六(可变形参)

1、实现函数的可变形参

1)、va_list:这是一个可变类型,用于定义指向可变参数列表的指针变量

2)、va_start:让argList指向一个可变参数列表的第一个参数

3)、提取argList当前指针指向的参数,并且将指针指向下一个参数

4)、释放argList指针,结束提取

2、测试代码

Args.h

    #ifndef Args_h
    #define Args_h
    #import <Foundation/Foundation.h>
    @interface Args : NSObject
    -(void)test:(id)name, ...;
    @end
    #endif /* Args_h */

Args.m

    #import <Foundation/Foundation.h>
    #import "Args.h"
     
    @implementation Args
    -(void)test:(id)name, ...
    {
        //va_list:这是一个可变类型,用于定义指向可变参数列表的指针变量
        va_list argList;
        if (name)
        {
            NSLog(@"%@", name);
            //va_start:让argList指向一个可变参数列表的第一个参数
            va_start(argList, name);
            //提取argList当前指针指向的参数,并且将指针指向下一个参数
            NSString *arg = va_arg(argList, id);
            while (arg)
            {
                NSLog(@"%@", arg);
                arg = va_arg(argList, id);
            }
            //释放argList指针,结束提取
            va_end(argList);
        }
    }
    @end

main.m

    #import <UIKit/UIKit.h>
    #import "AppDelegate.h"
    #import "Person.h"
    #import "Apple.h"
    #import "User.h"
    #import "Args.h"
    #import "KVCPerson.h"
     
    int main(int argc, char * argv[]) {
        @autoreleasepool {
            Args *arg = [Args new];
            [arg test:@"chenyu", @"chenxuan", @"chencaifeng", nil];
     
        }
    }

 
3、运行结果

    chenyu
    chenxuan
    chencaifeng

4、对比总结

这个oc里面和c语言里面的实现差不多如下面的代码

    #include <stdio.h>
    #include <stdarg.h>
     
    void PrintLines(char *first,...)
    {
        char *str;
        va_list v1;
        str = first;
        va_start(v1,first);
        do
        {
            printf("%s\n",str);
            str=va_arg(v1,char*);
        } while (str != NULL );
        va_end(v1);
    }
     
    int main(int argc, char* argv[])
    {
        PrintLines("First1","Second2","Third3","Fourth4",NULL);
        return 0;
    }






 


作者:chen.yu
深信服三年半工作经验,目前就职游戏厂商,希望能和大家交流和学习,
微信公众号:编程入门到秃头 或扫描下面二维码
零基础入门进阶人工智能(链接)