`
纳木那咔
  • 浏览: 13046 次
  • 性别: 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程序设计].杨正洪等.扫描版

    《Objective-C程序设计》(作者杨正洪、郑齐心、李建国)通过大量的实例系统地介绍了Objective-C语言的基本概念、语法规则、框架、类库及开发环境。读者在阅读本书后,可以掌握Objective-C语言的基本内容,并进行...

    Objective-C2.0程序设计

    15.2.2 可变对象与不可变对象 15.2.3 可变字符串 15.2.4 所有对象到哪里去了 15.3 数组对象 15.4 同步AddressCard方法 15.4.1 快速枚举 15.4.2 数组排序 15.5 词典对象 15.6 集合对象 15.7 练习 第16章 使用文件 ...

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

    主要给大家介绍了关于Swift如何调用Objective-C的可变参数函数的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用swift具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

    Swift中的可变参数函数介绍

    主要介绍了Swift中的可变参数函数介绍,本文实现了和Objective-C调用方法一样的变参数函数,需要的朋友可以参考下

    objective-c-tutorial:这是我在学习时编写的所有目标c教程代码

    directional_example_of_objective_c 如何定义属性如何写构造函数如何编写实例方法如何初始化对象如何使用定义的对象#premitive_type_variable_example 所有变量的例子如何打印它们所有变量说明符所有可变的实际尺寸...

    基于Pytorch的高性能演化计算库python源码+演算计算报告.zip

    - 优化问题为单目标优化(single objective),即测试函数的值域为实数域 $y\in \R$。 - 测试函数的定义域为$x\in D, D=[lb, ub]^d\subseteq \R^d$, 即考虑了边界约束(bound constrained)。 - 优化目标是最小值...

    Swift实现播放器项目联系

    它消除了一些 Objective-C 中的繁琐语法,提供了更加现代化和友好的开发环境。 3. **面向对象**:Swift是一种面向对象的编程语言,支持类、结构体、枚举等面向对象概念。同时也支持面向协议编程,使得多态、封装和...

    Miscellaneous:该存储库包含有助于越狱的iOS开发的内容

    检查所有Objective-C方法并为其创建函数。 这对于带符号剥离的文件特别有用,因为IDA Pro通常无法将这些功能识别为代码。 将名称添加到所有ivars和类。 dyld_decache 从iPhone OS 3.1开始,系统提供的各个库文件...

    C语言程序大作业:基于qt制作学生信息管理系统.zip

    C++是完全面向对象的,这一点和Objective-c等在开发很相似。而Qt又是基于C++一种语言的扩展,大家都知道C++ 有快速、简易、面向对象等很多优点,所以Qt自然也继承者C++这些的优点。 Qt良好的封装机制使得Qt的模块化...

    C语言程序设计大作业:学生成绩管理系统代码(Qt).zip

    C++是完全面向对象的,这一点和Objective-c等在开发很相似。而Qt又是基于C++一种语言的扩展,大家都知道C++ 有快速、简易、面向对象等很多优点,所以Qt自然也继承者C++这些的优点。 Qt良好的封装机制使得Qt的模块化...

    C语言实验:基于C++&QT实现的网吧计费系统源码与实验报告(Latex).zip

    C++是完全面向对象的,这一点和Objective-c等在开发很相似。而Qt又是基于C++一种语言的扩展,大家都知道C++ 有快速、简易、面向对象等很多优点,所以Qt自然也继承者C++这些的优点。 Qt良好的封装机制使得Qt的模块化...

    C语言GUI学习项目:基于C++&Qt编写的一个简易计算器和打车计费系统.zip

    C++是完全面向对象的,这一点和Objective-c等在开发很相似。而Qt又是基于C++一种语言的扩展,大家都知道C++ 有快速、简易、面向对象等很多优点,所以Qt自然也继承者C++这些的优点。 Qt良好的封装机制使得Qt的模块化...

    基于Python-PyQt5饭卡管理系统.zip

    C++是完全面向对象的,这一点和Objective-c等在开发很相似。而Qt又是基于C++一种语言的扩展,大家都知道C++ 有快速、简易、面向对象等很多优点,所以Qt自然也继承者C++这些的优点。 Qt良好的封装机制使得Qt的模块化...

    C++课设作业:基于Qt-qvfb开发的电子点菜系统.zip

    C++是完全面向对象的,这一点和Objective-c等在开发很相似。而Qt又是基于C++一种语言的扩展,大家都知道C++ 有快速、简易、面向对象等很多优点,所以Qt自然也继承者C++这些的优点。 Qt良好的封装机制使得Qt的模块化...

    C++课程设计大作业:基于Qt-C++的学生成绩管理系统.zip

    C++是完全面向对象的,这一点和Objective-c等在开发很相似。而Qt又是基于C++一种语言的扩展,大家都知道C++ 有快速、简易、面向对象等很多优点,所以Qt自然也继承者C++这些的优点。 Qt良好的封装机制使得Qt的模块化...

    C++课程设计:基于Ubuntu16.04的QT界面局域网聊天系统.zip

    C++是完全面向对象的,这一点和Objective-c等在开发很相似。而Qt又是基于C++一种语言的扩展,大家都知道C++ 有快速、简易、面向对象等很多优点,所以Qt自然也继承者C++这些的优点。 Qt良好的封装机制使得Qt的模块化...

    毕业设计项目:校园导航系统 QT界面+TSP(模拟退火)+A star寻路+最少换乘+单车调度(最小费用最大流)等.zip

    C++是完全面向对象的,这一点和Objective-c等在开发很相似。而Qt又是基于C++一种语言的扩展,大家都知道C++ 有快速、简易、面向对象等很多优点,所以Qt自然也继承者C++这些的优点。 Qt良好的封装机制使得Qt的模块化...

    毕设项目:基于QT+sqlite的网络文件分享系统.zip

    C++是完全面向对象的,这一点和Objective-c等在开发很相似。而Qt又是基于C++一种语言的扩展,大家都知道C++ 有快速、简易、面向对象等很多优点,所以Qt自然也继承者C++这些的优点。 Qt良好的封装机制使得Qt的模块化...

Global site tag (gtag.js) - Google Analytics