object-c 不定參数的遍历和原理
object-c接收随意类型的參数:
/**
* 接收String类型的多个參数
* @param firsParam 第一个參数
*/
-(void)TestString:(NSString*)firsParam, ... {
va_list list;
va_start(list, firsParam);
NSString* param;
NSLog(@"firstParam:%@",firsParam);
while ((param = va_arg( list, NSString *)))
{
if(param){
NSLog(@">>>>>>>>>>%@",param);
}
}
va_end(list);
}
/**
* 接收随意类型的多个參数
* @param firsParam 第一个參数
*/
-(void)TestObject:(id)firsParam, ... {
va_list list;
va_start(list, firsParam);
id param;
NSLog(@"firstParam:%@",firsParam);
while ((param = va_arg( list, id)))
{
if(param){
NSLog(@">>>>>>>>>>%@",param);
}
}
va_end(list);
}
/**
* 注意:调用的时候最后一个參数必须为nil,否则会发生很严重的错误:EXC_BAD_ACCESS
*/
-(void)test{
//[self TestString:@"7",@"9",@"5",nil];
[self TestObject:@"7",@"9",@"5",@"abc",@[@1,@5],@{@"a":@"b"},nil];
}
原理:利用 va_list va_start va_arg va_end 这几个宏来实现的.首先得到第一个參数得到第一个參数的地址,然后依据可变參数的列表指针依次遍历得到每个參数,直到为地址为nil为止;
va_list params; //定义一个指向个数可变的參数列表指针;
va_start(params,firsParam);//va_start 得到第一个可变參数地址,
va_arg(params,id);//指向下一个參数地址
va_end(params); //置空指针
object-c 不定參数的遍历和原理的更多相关文章
- 增强for循环、Map接口遍历、可变參数方法
增强for循环 1.for循环能做得事情.增强for循环大部分都能做(假设要想获得下标的时候就必须使用简单for循环了) 2.增强for有时候可以方便的处理集合遍历的问题,可是集合的标准遍历是使用迭代 ...
- C语言变长參数的认识以及宏实现
1.认识 变长參数是C语言的特殊參数形式.比如例如以下函数声明: int printf(const char *format, ....); 如此的声明表明,printf函数除了第一个參数类型为con ...
- linux kernel的cmdline參数解析原理分析
利用工作之便,今天研究了kernel下cmdline參数解析过程.记录在此.与大家共享.转载请注明出处.谢谢. Kernel 版本:3.4.55 Kernel启动时会解析cmdline,然后依据这些參 ...
- Printf可变參数使用
參考文档: http://bbs.csdn.net/topics/70288067 Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源 本文的二 ...
- java 可变參数列表
Java SE5加入了可变參数列表特性 參数能够这样定义.(Object-args).可变參数用"..."来定义,args是可变參数的数组.举个样例: package sample ...
- Effective JavaScript Item 55 接受配置对象作为函数參数
接受配置对象作为函数參数 尽管保持函数接受的參数的顺序非常重要,可是当函数可以接受的參数达到一定数量时.也会让用户非常头疼: var alert = new Alert(100, 75, 300, 2 ...
- java參数传递机制浅析
欢迎转载,转载请声明出处! ----------------------------------------- 前言: java语言中,參数的传递仅仅有一种机制.那就是值传递. 举例: 以下将通过几个 ...
- OC可变參数的函数实现va_start、va_end、va_list的使用
一.简单介绍 我们常常在编程的时候看见类似这种代码,如图1.1 图1.1 或者是这种可变參数,如图1.2 图1.2 二.基本知识介绍 在学习怎样写这样的格式的函数前,先简介几个经常使用的宏: 下面摘自 ...
- CloudStack全局配置參数
參数 描写叙述 类型 默认值 account.cleanup.interval 清除用户账户所须要等待的时间(秒) 整数 86400 agent.lb.enabled If agent load ba ...
随机推荐
- python--修改默认递归层级
import sys sys.setrecursionlimit(最大递归次数)
- ACM_黑色星期五
黑色星期五 Time Limit: 2000/1000ms (Java/Others) Problem Description: 13号又是星期五是一个不寻常的日子吗?13号在星期五比在其他日少吗?为 ...
- 最新省市区划分码code
爬取国家统计局省市区code 提供php爬取脚本以及json和sql https://github.com/zzDylan/area-code 觉得好用给个star,3q
- PHP中单例模式与工厂模式
单例模式概念 单例模式是指整个应用中类只有一个对象实例的设计模式. 单例模式的特点 一个类在整个应用中只有一个实例 类必须自行创建这个实例 必须自行向整个系统提供这个实例 php中使用单例模式的原因 ...
- CSS——display:flex
Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 设为Flex布局以后,子元素的float.clear和vertical-align属性 ...
- C#——反射动态创建类的实例
“反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 若要反射当前项目中的类(即当前项目已经引用它了),可以使用下面的写法. ...
- C# 定时无操作则退出登陆,回到登陆界面。
有时候根据需求需要为程序添加在规定的时间内无操作则退出当前的登陆程序的功能,如下代码模拟描述的需求功能. using System; using System.Collections.Generic; ...
- (转) Hibernate检索方式概述
http://blog.csdn.net/yerenyuan_pku/article/details/70554816 Hibernate检索方式概述 我们在对数据库的操作中,最常用的是select, ...
- 扩增子图表解读6韦恩图:比较组间共有和特有OTU或分类单元
韦恩图 Venn Diagram Venn Diagram,也称韦恩图.维恩图.文氏图,用于显示元素集合重叠区域的图示. 韦图绘制工具 常用R语言的VennDiagram包绘制,输出PDF格式方便 ...
- PHP 之中文转为拼音
/** * Created by PhpStorm. * User: Administrator * Date: 2019/1/2 0002 * Time: 下午 1:01 */ class PinY ...