美文网首页
iOS中可变参数个数方法

iOS中可变参数个数方法

作者: 小盟城主 | 来源:发表于2019-01-18 17:54 被阅读40次

一个可变参数函数是指一个函数拥有不定的参数,即为一个函数可接收多个参数。

在iOS中比较常见的比如NSArray中的初始化函数方法

+ (instancetype)arrayWithObjects:(ObjectType)firstObj, ... NS_REQUIRES_NIL_TERMINATION;

  其中NS_REQUIRES_NIL_TERMINATION,是一个宏,用于编译时非nil结尾的检查。 调用时要以nil结尾,否则会崩溃。
字面的意思是NS系列的需要以nil作为终止符

  这里由于是可变参数,所以参数的个数并不确定,所有在系统进行遍历该你传进去的参数时会进行判断是否读取到nil的终止符。当读到终止符nil时确定参数的个数停止进行遍历。

  在iOS要实现不定参数的函数,有一个方案是用C/C++中的va_list、va_start、va_arg、va_end来实现。这样实现需要一个哨兵参数,就是调用方法是最后必须要加一个nil或者0的参数,该参数就称为哨兵参数。

  • va_list args用于声明一个变量,我们知道函数的可变参数列表其实就是一个字符串,所以va_list才被声明为字符型指针,这个类型用于**声明一个指向个数可变的参数列表的字符型指针变量。

  • va_start(args, param):初始化前面定义的va_list变量,让指针一开始指向首个参数。args--我们之前定义的偏移指针 param--参数列表的第一个参数。

  • va_arg(args, type)函数的作用是根据指针进行取值,取出值以后返回,并且指针偏移一位,所以可以进行一个循环,通过va_arg不停的移动指针,依次取出后面的参数。args---作用同上 type--参数的类型,如NSString *。

  • a_end(args):清空参数列表,并置参数指针args无效,结束参数的获取。

举例说明

//声明
- (void)test:(NSString *)firstParam, ... NS_REQUIRES_NIL_TERMINATION;
// 实现

// 可变参数
- (void)test:(NSString *)firstParam,... NS_REQUIRES_NIL_TERMINATION{
    if (firstParam) {
        // 取出第一个参数
        NSLog(@"%@", firstParam);
        // 定义一个指向个数可变的参数列表指针;
        va_list args;
        // 用于存放取出的参数
        NSString *arg;
        // 初始化上面定义的va_list变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数
        va_start(args, firstParam);
        // 遍历全部参数 va_arg返回可变的参数(a_arg的第二个参数是你要返回的参数的类型)
        while ((arg = va_arg(args, NSString *))) {
            NSLog(@"%@", arg);
        }
        // 清空参数列表,并置参数指针args无效
        va_end(args);
    }
}

相关文章

  • Java中的可变参数

    学习笔记:可变参数,仅语法 可变参数又称参数的个数可变,用作方法形参的出现,那么方法的参数个数就是可变的了. 格式...

  • iOS中可变参数个数方法

    一个可变参数函数是指一个函数拥有不定的参数,即为一个函数可接收多个参数。 在iOS中比较常见的比如NSArray中...

  • 2020-06-29可变参数

    可变参数 概述:可变参数又称参数个数可变,用作方法的形参出现,那么方法参数个数就是可变的了。 格式①修饰符 返回值...

  • java 可变参数

    可变参数 可变参数是参数的个数为任意个,参数的类型不能改变 一个方法中,只能有一个可变参数 当一个方法中有多个参数...

  • iOS可变参数实现及原理剖析

    iOS可变参数实现及原理剖析 标签(空格分隔): iOS可变参数 iOS方法后面为什么有nil参数 你一定会时常见...

  • Java面向对象

    一、方法 定义 可变参数 方法重载在一个类中定义多个同名的方法,但要求每个方法具有不同的参数类型或参数的个数。调用...

  • Python参数 * 与 ** ,及装包拆包

    (*args)可变参数在Python函数中,还可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的,可以...

  • 可变参数

    可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理。如下所示:print()方法,用于...

  • 函数参数

    1、可变参数,参数个数可变 在参数前面加上* 就代表可变参数 可变参数,在函数内部其实就是一个tuple def ...

  • Java基础——可变参数

    .. 从java5开始出现了可变参数,这是对java方法及数组的拓展!方法中可以接受的参数不再是固定个数的,而是随...

网友评论

      本文标题:iOS中可变参数个数方法

      本文链接:https://www.haomeiwen.com/subject/dytodqtx.html