`
纳木那咔
  • 浏览: 13196 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Objective-C可变参数函数

阅读更多

首先作为一个coder 很多时候会遇到自己不能解决的问题需要上网查资料,

因为没有学过多少c语言,所以这方面只能请求网上的前辈,然后就看了关于 “Objective-C可变参数函数”的文章,可惜网上只有转载,其实就是1篇文章而已。

而且不知道我自己水平没能理解 还是演示demo就有问题,或者大家都没发现的一个问题。这里重新按照自己的理解重新写一个使用oc可变参数函数的方法。本人能力有限,如果遇到错误或代码问题,麻烦大家指出

 

 

-(NSArray *)actionUsePic:(id)actionNum, ... {

    NSMutableArray *argsArray = [[NSMutableArray alloc] init]; 
    va_list params; //定义一个指向个数可变的参数列表指针; 
    va_start(params,actionNum);//va_start  得到第一个可变参数地址,
    id arg;
    
    if (actionNum) {
        //将第一个参数添加到array
        id prev = actionNum;
        [argsArray addObject:prev];
    
        //va_arg 指向下一个参数地址 
        //这里是问题的所在 网上的例子,没有保存第一个参数地址,后边循环,指针将不会在指向第一个参数
        while( (arg = va_arg(params,id)) ) 
        {
            if ( arg ){
                [argsArray addObject:arg];
            }
    
        }
        //置空
        va_end(params); 
        //这里循环 将看到所有参数
        for (NSNumber *num in argsArray) {
            NSLog(@"%d", [num intValue]);
        }
    }
    return argsArray;
    
}
 

 

//调用测试
[self actionUseNum:
			      [NSNumber numberWithInt:1],
			      [NSNumber numberWithInt:2],
			      [NSNumber numberWithInt:3],
			      [NSNumber numberWithInt:4], 
			      nil];
 

 

在调用的时候要在参数结尾加nil

关于 va_list  va_start va_arg va_end 几个宏

 

 

va_list params; //定义一个指向个数可变的参数列表指针;

 

va_start(params,actionNum);//va_start  得到第一个可变参数地址,

 

va_arg(params,id);//指向下一个参数地址 

 

va_end(params); //置空指针

分享到:
评论
2 楼 lixing333 2012-08-07  
而且,这个特性只有在多个相似参数重复出现的时候才能用,而这种机会实在不太大,除了多个数字相加,我想不出来其他的用处。
另外,在这种情况下,直接将一个array传入就可以了,方便简单。
所以我觉得这个功能好像的确没啥用啊
1 楼 lixing333 2012-08-07  
这的确是一个强大的功能,不过好像用到的几率不多,我开发快一年了还没有用到这个特性的机会

相关推荐

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

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

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

    2. **与运行时系统的交互**:探讨了Objective-C程序如何与运行时系统进行交互,包括通过Objective-C源代码、通过类`NSObject`的方法以及通过直接调用运行时系统的函数。 3. **消息**:详细解释了Objective-C中的...

    objective-c编程 第2版=objective-c program 2nd edition_13889311

    这使得Objective-C既具有C的底层控制能力,又具备了现代编程语言的灵活性和可扩展性。在"Objective-C编程 第2版"中,可能涵盖了以下几个重要知识点: 1. **基础语法**:学习Objective-C首先需要了解它的基本语法,...

    Objective-C培训教程

    Objective-C是一种面向对象的编程语言,它是C语言的一个超集,并且是用于Mac OS和iOS应用开发的主要语言。它具有动态绑定、内存管理、面向对象的特性,允许开发者编写高效和可重用的代码。 第一章程序整体语法结构...

    Learn Objective-C 中文版 v2

    - **NSArray和NSMutableArray**:分别代表不可变和可变的数组。 - **NSDictionary和NSMutableDictionary**:表示键值对的集合。 - **NSString**:处理文本的类,提供了丰富的字符串操作方法。 - **NSNumber**:...

    [Objective-C编程(第6版)]Programming in Objective-C

    它们分别表示强引用、弱引用和不可变的非拥有的引用。 ##### 5. 高级主题 - **协议**:Objective-C中的协议类似于其他语言中的接口,它定义了一个对象应该遵循的行为规范,但不提供具体实现。 - **类别**:类别是...

    Objective-C语言教程、案例与项目资源详解.docx

    4. **开源项目**:GitHub上有大量的Objective-C项目可供参考和学习。 5. **社区论坛**:Stack Overflow、Reddit等论坛是寻求帮助的好地方。 通过结合以上学习资源和实践经验,你可以更深入地理解和掌握Objective-C...

    Objective-C开发范例代码大全

    - **定义与使用**:Objective-C中的代码块是一种内联函数,可以作为参数传递、存储在变量中、返回给调用者。 - **捕获变量**:块可以捕获并使用定义时的局部变量,甚至可以修改这些变量(如果它们是可变的)。 4....

    Objective-C 入门指南 中文

    - **NSArray**:一个不可变的数组类,用于存储对象集合。 - **NSDictionary**:一个键值对集合,用于存储对象及其对应的键名。 #### 6. 优缺点分析 - **优点**: - **面向对象**:强大的面向对象编程能力。 - **...

    The Objective-C Programming Language

    2. **消息传递**:Objective-C采用消息传递机制来调用方法,这与传统过程式语言中的函数调用不同。当一个对象接收到一个消息时,它会执行相应的操作或返回结果。 3. **动态类型**:Objective-C支持动态类型,这意味...

    Swift如何调用Objective-C的可变参数函数详解

    总之,Swift调用Objective-C的可变参数函数需要对Objective-C的函数进行改造,使其接收`va_list`参数,然后在Swift中使用`withVaList`函数创建`va_list`并传递给Objective-C方法。通过这种方式,我们可以充分利用...

    Objective-C 2.0程序设计

    #### 一、Objective-C语言基础 - **类与对象**:Objective-C是一种面向对象的语言,其核心概念是类和对象。类定义了对象的行为和属性,对象则是类的一个实例。本书第一章至第七章会详细介绍类和对象的概念及其在...

    From C++ to Objective-C

    - **可变参数列表**:Objective-C支持可变参数列表的方法。 - **匿名参数**:在Objective-C中,可以通过省略参数名称来实现匿名参数。 - **方法修饰符**:包括`const`、`static`、`virtual`等关键字,用于修饰方法的...

    iPhone开发资料之Objective-C语言简介

    `NSString`是一个不可变的字符串对象,支持Unicode,方便进行格式化和内存管理。创建字符串可以通过直接赋值或使用`stringWithFormat:`方法: ```objc NSString *myString = @"My String"; NSString *anotherString...

    iOS开发Objective-C项目工程混淆脚本.zip

    1. **变量和函数重命名**:通过将有意义的变量名和函数名替换为无意义的字符串,使得阅读代码变得困难。Objective-C中可以使用宏定义、Category或Category中的方法来实现这一目的。 2. **代码混淆**:通过对代码...

    objective-c

    Objective-C是一种面向对象的编程语言,它是C语言的超集,添加了Smalltalk风格的消息传递机制,主要用于开发苹果平台上的应用程序,包括iOS和macOS。Objective-C是在20世纪80年代由Stepanov和Moss在施乐帕洛阿尔托...

Global site tag (gtag.js) - Google Analytics