`
jsntghf
  • 浏览: 2542808 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Objective C中定义可变参函数

    博客分类:
  • iOS
阅读更多

Objective C中有很多不定参函数,例如NSLog(format, arg1, arg2),还有字符串或数组在构造时所用的[NSString stringWithFormat: format, arg1, arg2, arg3],它们的方法原型分别是:

 

FOUNDATION_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);

+ (id)stringWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);

 

现在来看一个实际的例子:

 

- (void) doLog:(NSString *)formatStr, ... {
    if (!formatStr)
		return;
	va_list arglist;
	va_start(arglist, formatStr);
	NSString *outStr = [[[NSString alloc] initWithFormat:formatStr arguments:arglist] autorelease];
	va_end(arglist);
	NSLog(@"%@", outStr);
}

 

由此可见,va_list、va_start、va_end正是处理不定参数的关键。

 

接下来,再来看一个例子:

 

- (void) doLog:(NSString *)formatStr, ... {
    if (!formatStr)
		return;
	va_list arglist;
	va_start(arglist, formatStr);
	id arg;
    while(arg = va_arg(arglist, id)) {
        if (arg)
            NSLog(@"%@", arg);
    }
	va_end(arglist);
}

 

va_list argList:定义一个指向个数可变的参数列表指针。

va_start(argList, statement):使参数列表指针arg_ptr指向函数参数列表中的第一个可选参数。

argN是位于第一个可选参数之前的固定参数,或者说是最后一个固定参数,即…之前的那个参数,函数参数列表中参数在内存中的顺序与函数声明时的顺序是一致的。如果有一个va函数的声明是void va_test(char a, char b, char c, …),则它的固定参数依次是a,b,c,最后一个固定参数argN为c,因此就是va_start(arg_ptr, c)。

va_arg(argList, id):返回参数列表中指针arg_ptr所指的参数,返回类型为type,并使指针arg_ptr指向参数列表中的下一个参数。

va_end(arg_ptr):清空参数列表,并置参数指针arg_ptr无效。

 

在调用的时候要在参数结尾加上nil,最后一个nil能让va_arg取参数时碰到nil则断定为NO,终止循环。

分享到:
评论

相关推荐

    [iOS]Objective-C利用协议实现回调函数(类似java的回调函数)

    在标题提及的“[iOS]Objective-C利用协议实现回调函数(类似java的回调函数)”中,我们主要讨论的是Objective-C如何通过协议(Protocol)来实现类似于Java中的回调函数功能。这种机制对于异步编程、事件处理以及...

    Objective-C函数速查实例手册光盘 源文件

    - **协议(Protocol)**:Objective-C的协议类似于Java和C#的接口,定义了一组方法签名,可被多个类实现。 - **分类(Category)**:允许向已存在的类添加方法,无需继承。 2. **Objective-C函数**: - **实例...

    基于Objective-C的JSON数据生成Objective C类定义设计源码

    本设计源码提供了一个基于Objective-C的JSON数据生成Objective C类定义的工具,包含21个文件,其中包括4个gitignore文件,4个m源文件,3个h头文件,2个xib文件,2个md文档,1个pbxproj文件,1个xcworkspacedata文件...

    C语言主要知识点巩固(学习Objective-C 的前提)

    函数是C语言中代码复用和模块化的工具。函数可以接收参数并返回值,如内置的printf()用于输出,scanf()用于输入。理解函数的声明、定义和调用是编程的关键。 指针是C语言的特色之一,它允许直接操作内存地址。通过...

    Objective-C和C语言混编的计算器

    在计算器应用中,Objective-C可能会用于创建视图控制器、定义界面元素的交互以及处理用户输入。 在计算器中,C语言可能被用于实现计算逻辑。由于C语言的性能优势和对底层运算的控制,它可以编写高效的算法来执行加...

    Objective-C变参方法实现

    Objective-C 可变单数方法实现

    ios demo,object-c调用函数和c++函数

    - 在Objective-C类中,你需要使用`@interface`, `@implementation`和`@end`来定义类,但在C++函数的定义和声明之前,你可以插入C++的代码。 - 包裹C++代码在`extern "C"`块中,以避免名字修饰(name mangling),...

    Objective-C基础教程(入门教程).pdf

    26. 打印输出:在Objective-C程序中,通常使用printf函数来进行标准输出,这与C语言中的做法相同。 27. 变量作用域(Variable Scope):Objective-C中的变量可以有特定的作用域,如类作用域、实例作用域、局部作用...

    Objective-C程序设计

    首先,Objective-C是在C语言基础上扩展的,它引入了消息传递机制和类的概念,这使得它具有高度的灵活性和可扩展性。在Objective-C中,对象通过发送消息来执行操作,这种机制类似于其他语言中的方法调用。消息传递的...

    Objective-C 2.0 运行时系统编程指南

    3. **通过直接调用运行时系统的函数**:开发者可以直接调用Objective-C运行时系统提供的函数,这些函数允许在运行时增加类或方法,或获取所有类的定义列表等。 #### 消息 在Objective-C中,消息是一种向对象发送...

    Objective-C程序设计 第6版 pdf

    书中会讲解基本的数据类型、控制结构、函数和指针等基础知识,同时介绍Objective-C特有的动态类型和消息传递机制。 2. **面向对象编程**:Objective-C是面向对象的语言,它支持类、继承、封装和多态等概念。书中会...

    Objective-C

    Objective-C是在C语言的基础上扩展了Smalltalk式的面向对象特性,使得它既有C语言的强大功能,又具备了面向对象编程的灵活性。 在Objective-C中,类是所有对象的基础。类定义了一组属性(实例变量)和方法(函数)...

    ObjectiveC 学习 入门基 础教程第2版

    6. Blocks:Blocks是ObjectiveC中的一种内联函数,可以捕获并存储上下文中的局部变量,常用于异步操作和回调。 关键字与语法: 1. `@interface`和`@implementation`:定义类的接口和实现。 2. `@property`:声明...

    Objective-C培训教程

    此外,Objective-C中的注释语法和C语言相同,可以使用单行注释(//)和多行注释(/**/)。Objective-C中的nil相当于C中的NULL,用于表示空指针。YES和NO是Objective-C特有的布尔值表示方法,分别代表逻辑真和假,其值...

    Objective-C编程全解最新版.pdf.zip

    8. ** Blocks **:Objective-C引入了Blocks,这是一种内联函数或闭包,可以捕获和存储其定义时的作用域内的局部变量,常用于异步编程和函数式编程风格。 9. **Foundation框架**:Foundation是Objective-C的基础框架...

    ObjectiveC&C++的混合编译简单demo

    ObjectiveC是Apple的面向对象的编程语言,基于C语言,而C++则是一种广泛使用的通用、面向对象的编程语言,拥有丰富的库支持和高效性能。这两种语言可以混合使用,以利用各自的优点,比如ObjectiveC的Objective-C ...

    Objective-c语言学习-快速入门完整版完整版

    Objective-C是在C语言基础上扩展的,引入了Smalltalk的面向对象特性,如消息传递机制,使得代码更加灵活和可扩展。 "第二讲 数据类型、运算符和表达式"深入讲解了基本的数据类型,包括整型、浮点型、字符型等,以及...

    objective-c基础教程第2版.pdf

    Objective-C是一种面向对象的编程语言,它是C语言的扩展,最初由Brad Cox在20世纪80年代开发,并且广泛应用于Mac OS X和iOS的应用程序开发中。Objective-C在C语言的基础上增加了Smalltalk风格的消息传递机制,允许...

Global site tag (gtag.js) - Google Analytics