iOS学习笔记(5)形参个数可变的方法

  如果在定义方法时,在最后一个形参明后增加逗号和三点(,...),则表明该形参可以接受多个参数值。

  为了在程序中获取个数可变的形参,需要使用如下关键字

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

  · va_start:这是一个函数,该函数指定开始处理可变形参的列表,并让指针变量指向可变形参列表的第一个参数

  · va_end:结束处理可变形参,释放指针变量

  · va_arg:该函数返回获取指针当前指向的参数的值,并将指针移动到指向下一个参数

  例子

  Varargs.h

#import <Foundation/Foundation.h>

@interface Varargs : NSObject

//定义形参个数可变的方法
-(void)test:(NSString *)name,...;

@end

  Varargs.m

#import "Varargs.h"

@implementation Varargs
-(void)test:(NSString *)name,...
{
    // 使用va_list定义一个argList指针变量,该指针变量指向可变参数列表
    va_list argList;
    // 如果为第一个name参数存在,才需要处理后面的参数
    if (name)
    {
        // 由于name参数并不在可变参数列表中,因此先处理name参数
        NSLog(@"%@" , name);
        // 让argList指向第一个可变参数列表的第一个参数,开始提取可变参数列表的参数
        va_start(argList, name);
        // va_arg用于提取argList指针当前指向的参数,并将指针移动到指向下一个参数
        // arg变量用于保存当前获取的参数,如果该参数不为nil,进入循环体
        NSString* arg = va_arg(argList, id);
        while (arg)
        {
            // 打印出每一个参数.
            NSLog(@"%@",arg);
            // 再次提取下一个参数,并将指针移动到指向下一个参数
            arg = va_arg(argList, id);
        }
        // 释放argList指针,结束提取
        va_end(argList);
    }
}
@end

  main函数

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        Varargs* va = [[Varargs alloc] init];
        [va test:@"疯狂iOS讲义"
         , @"疯狂Android讲义", @"疯狂Ajax讲义" , nil];
    }
    return 0;
}

  注意:个数可变的形参只能处于形参列表的最后。一个方法中最多之恩给你保吉安一个长度可变的形参。

引自《疯狂iOS讲义(上)》

iOS学习笔记(5)形参个数可变的方法

时间: 2024-08-09 00:30:05

iOS学习笔记(5)形参个数可变的方法的相关文章

linux下java环境变量的设置,形参个数可变的方法

首先我们执行jdk二进制文件: 生成一个jdk目录,将这个目录mv到/usr/loca/jdk # vim /etc/profile export JAVA_HOME=/usr/local/jdkexport CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/libexport PAT# vim Varargs.java #source /etc/profile 例子: #vim test.java 这个例子中test方法形参个数可变,在形参列表中,最后一个形参

4.2 方法所属性、方法参数传递机制、形参个数可变的方法

一.方法的所属性 方法由传统的函数发展而来,方法与传统的函数显著不同:在结构化编程中,函数是一等公民,这个程序由一个个函数组成:在面向对象编程语言里,类才是一等公民,整个系统由一个个类组成.因此在Java语言里,方法不能独立存在,方法必须属于类或对象. 方法的所属性:(1)方法类似于函数.但与函数不同的是,方法不能存在,方法必须定义在类里面.(2)方法一定要有执行者,必须通过类或对象来调用方法.从逻辑上来看,该方法属于类本身,应该用类来调用 如果该方法有static修饰,该方法属于类本身,应该用

java中形参个数可变的方法使用

public class Varargs { public static void main(String[] args) { test(3,"java","C++","PHP"); } public static void test(int num,String... books) { System.out.println(num); for(String book : books) { System.out.println(book); }

再学Java 之 形参个数可变函数

自Java 5后,Java允许定义形参个数可变的方法,从而允许运行过程中,为方法指定不确定个数的形参. 其定义方法的格式如下: void function_name ( type ... variables){ //对variables数组进行操作 } 在上面格式中,系统将输入的参数全部存储到variables数组中.也就是说,下面的定义方式,其实是相同的: void function_name ( type ... variables); void function_name ( type[]

iOS学习笔记---oc语言第五天

字典,数组 ,集排序 一.字典类 存储以下数据 name:张三; sex:男;age:18 film:风暴; playcount:10000次;price:60元 字典类用于保存具有映射关系(key-value对)的数据 对于“name:张三”来讲,key就是“name”,key对应的value是“张 三” 一个key-value对认为是一个元素(实体),字典是存储key-value对 的容器. 特点: 与数组不同,数组靠下标存取数据,数组的下标是唯一的. 字典靠key存取元素.key不能重复,

黑马程序员--IOS学习笔记--数组及排序

IOS学习笔记 概述: 8_2.改变整型变量的符号 8_2.改变整型变量所占存储空间 8_3.char类型数据存储 8_4.数组的基本概念及分类 8_5.数组元素作为函数参数 8_5.一维数组定义及注意事项 8_6.一维数组初始化 8_7.一维数组一个让人疑惑的问题 8_8.一维数组的引用 8_9.应用:数组遍历 8_10.一维数组的存储方式 8_11.一维数组的地址 8_12.一维数组长度计算方法 8_13.一维数组的越界问题 8_14.应用:找最大值 8_15.数组元素作为函数参数 8_16

iOS学习笔记---c语言第十天

动态内存分配 一.存储区划分 从低到高(内存地址小----内存地址大)  :  代码区---常量区---静态区---堆区---栈区 栈内存 //凡是在函数体内定义的变量 都存储在栈区(包括形参). int a = 10;//a也是在栈区域里面 float b = 1.5;//b也是在栈区域里面 char c = 'b'; double d = 3.14; printf("%p %p %p %p\n",&a,&b,&c,&d); //栈的特点先进后出,先定

iOS学习笔记之ARC内存管理

iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其所指向对象的所有权 当某个方法(或函数)有一个指向某个对象的局部变量时,可以称该方法(或函数)拥有该变量所指向的对象,如: int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSSt

iOS学习笔记---c语言第十一天

函数指针 一.函数指针定义 //函数声明:声明我是一个什么函数 //求两个数的和 //函数的类型:int (int x,int y) //即:我是一个返回值为整型,有两个整型参数的函数. //函数名是 sum int sum(int x,int y); 函数指针定义p是变量,其他是类型(通常没有形参a,b) //函数指针类型 int (*)(int x,int y) //描述:指向 返回值为 int 两个int参数 的 指针类型 //函数指针变量: p //初始值 : sum printf("%