iOS va_list,va_start,va_end

- (id)initWithTitle:(NSString *)title

message:(NSString *)message

completionBlock:(void (^)(NSUInteger buttonIndex, EMAlertView *alertView))block

cancelButtonTitle:(NSString *)cancelButtonTitle

otherButtonTitles:(NSString *)otherButtonTitles, ... {

//#import <objc/runtime.h>头文件

//objc_setAssociatedObject需要四个参数:源对象,关键字,关联的对象和一个关联策略。

objc_setAssociatedObject(self, "blockCallback", [block copy], OBJC_ASSOCIATION_RETAIN_NONATOMIC);

if (self = [self initWithTitle:title message:message delegate:self cancelButtonTitle:nil otherButtonTitles:nil])

{

if (cancelButtonTitle) {

[self addButtonWithTitle:cancelButtonTitle];

self.cancelButtonIndex = [self numberOfButtons] - 1;

}

id eachObject;

va_list argumentList;//va_list 是一个字符指针,可以理解为指向当前参数的一个指针,取参必须通过这个指针进行

if (otherButtonTitles) {

[self addButtonWithTitle:otherButtonTitles];

va_start(argumentList, otherButtonTitles);// 然后应该对argumentList进行初始化,让它指向可变参数表里面的第一个参数,这是通过 va_start 来实现的,第一个参数是argumentList本身,第二个参数是在变参表前面紧挨着的一个变量,即“...”之前的那个参数

while ((eachObject = va_arg(argumentList, id))) {//然后是获取参数,调用va_arg,它的第一个参数是argumentList,第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值,并且把argumentList的位置指向变参表的下一个变量位置

[self addButtonWithTitle:eachObject];

}

va_end(argumentList);//置空argumentList//获取所有的参数之后,我们有必要将这个argumentList指针关掉,以免发生危险,方法是调用 va_end,它使输入的参数argumentList置为 NULL,应该养成获取完参数表之后关闭指针的习惯。说白了,就是让我们的程序具有健壮性。通常va_start和va_end是成对出现。

}

}

return self;

}

时间: 2025-01-15 06:16:48

iOS va_list,va_start,va_end的相关文章

关于C++函数接受数量不定的实参及cstdarg头文件中的va_list,va_start,va_end,va_arg使用范例。

编译环境:Vs2012: //Handling a variable number of arguments ///////////////////////////////////////////////////////////////////////////// #include <iostream>#include<stdlib.h>#include<cstdarg> using std::cout;using std::endl; int sum (int cou

va_list &amp; va_start &amp; va_arg &amp; va_end

va_list 属于变量 而 va_start & va_arg & va_end  C语言中解决变参问题的一组宏.头文件来自stdarg.h. 查看linux系统源码方式我一般用locate stdarg.h,然后找到提示目录vi进去.源文件定义是: 在Mac 下追踪头文件也会发现如下宏定义: typedef __darwin_va_list va_list; typedef __builtin_va_list    __darwin_va_list;    /* va_list */

va_list/va_start/va_arg/va_end深入分析

va_list/va_start/va_arg/va_end深入分析 va_list/va_start/va_arg/va_end这几个宏,都是用于函数的可变参数的. 我们来看看在vs2008中,它们是怎么定义的: 1: ///stdarg.h 2: #define va_start _crt_va_start 3: #define va_arg _crt_va_arg 4: #define va_end _crt_va_end 5: 6: ///vadefs.h 7: #define _ADD

C 中va_list,va_arg,va_start,va_end usage

1.在学习c语言,难免会遇到多参函数,刚好c中也提供了一些机制:宏函数 #ifdef _M_ALPHA typedef struct { char *a0; /* pointer to first homed integer argument */ int offset; /* byte offset of next parameter */ } va_list; #else typedef char * va_list; #endif _M_ALPHA是指DEC ALPHA(Alpha AXP

【转】C/C++中可变参数的详细介绍(va_list,va_start,va_arg,va_end)

可变参数的函数原理其实很简单,而va系列是以宏定义来定义的,实现跟堆栈相关.我们写一个可变函数的C函数时,有利也有弊,所以在不必要的场合,我们无需用到可变参数.如果在C++里,我们应该利用C++的多态性来实现可变参数的功能,尽量避免用C语言的方式来实现. 由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦,即使采用C++,如果参数个数不能确定,也很难采用函数重载.对这种情况,提出了指针参数来解决问题. 如printf()函数,其原型为:int   printf(   const  

创建函数利用可变参数列表的形式模拟实现printf的功能

★创建函数利用可变参数列表的形式模拟实现printf的功能. 模拟简单的输入单个字符和字符串时的输出形式 如:输入:%c %c %c %c %c\t%s,'h','e','l','l','o',"welcome to here!" 输出:h e l l o   welcome to here! #include<stdio.h> #include<stdlib.h> #include<stdarg.h>    //需引入stdarg的头文件以便建立可

c语言可变参

一.什么是可变参数 在C语言编程中有时会遇到一些参数个数可变的函数,例如printf(),scanf()函数,其函数原型为: int printf(const char* format,-),int scanf(const char *format,-);它除了有一个参数format固定以外,后面跟着的参数的个数和类型是可变的(用三个点"-"做参数占位符),实际调用时可以有以下的形式:            printf("%d",i);  printf("

c语言中如何实现可变参数

c语言函数库中有不少类似于printf,scanf的函数,这些函数接收的参数个数是不确定的.这些函数实际是通过<stdarg.h>文件中的va_list,va_start,va_arg,va_end宏定义是实现的.另外,我们知道程序运行时的内存结构后,也可以通过直接访问这些内存空间获得实际参数值(事实上stdarg.h文件中的相关宏定义就是这么操作的). #include <stdio.h> #include <stdlib.h> #include <stdarg

【C++】C++中的函数

目录结构: contents structure [-] 简介 可变形参的函数 initializer_list形参 省略符形参 main函数处理命令行选项 函数指针与函数引用 inline内联函数 Constexpr函数 1.简介 通常函数包括形参,函数名,函数主体,函数返回值.下面的案例展示了c++函数使用的基本语法规则: int add(int,int);//add函数的声明 int main(int argc,char *argv[]){ int res = add(1,1); retu