首先作为一个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); //置空指针
分享到:
相关推荐
26. 打印输出:在Objective-C程序中,通常使用printf函数来进行标准输出,这与C语言中的做法相同。 27. 变量作用域(Variable Scope):Objective-C中的变量可以有特定的作用域,如类作用域、实例作用域、局部作用...
2. **与运行时系统的交互**:探讨了Objective-C程序如何与运行时系统进行交互,包括通过Objective-C源代码、通过类`NSObject`的方法以及通过直接调用运行时系统的函数。 3. **消息**:详细解释了Objective-C中的...
这使得Objective-C既具有C的底层控制能力,又具备了现代编程语言的灵活性和可扩展性。在"Objective-C编程 第2版"中,可能涵盖了以下几个重要知识点: 1. **基础语法**:学习Objective-C首先需要了解它的基本语法,...
Objective-C是一种面向对象的编程语言,它是C语言的一个超集,并且是用于Mac OS和iOS应用开发的主要语言。它具有动态绑定、内存管理、面向对象的特性,允许开发者编写高效和可重用的代码。 第一章程序整体语法结构...
- **NSArray和NSMutableArray**:分别代表不可变和可变的数组。 - **NSDictionary和NSMutableDictionary**:表示键值对的集合。 - **NSString**:处理文本的类,提供了丰富的字符串操作方法。 - **NSNumber**:...
它们分别表示强引用、弱引用和不可变的非拥有的引用。 ##### 5. 高级主题 - **协议**:Objective-C中的协议类似于其他语言中的接口,它定义了一个对象应该遵循的行为规范,但不提供具体实现。 - **类别**:类别是...
4. **开源项目**:GitHub上有大量的Objective-C项目可供参考和学习。 5. **社区论坛**:Stack Overflow、Reddit等论坛是寻求帮助的好地方。 通过结合以上学习资源和实践经验,你可以更深入地理解和掌握Objective-C...
- **定义与使用**:Objective-C中的代码块是一种内联函数,可以作为参数传递、存储在变量中、返回给调用者。 - **捕获变量**:块可以捕获并使用定义时的局部变量,甚至可以修改这些变量(如果它们是可变的)。 4....
- **NSArray**:一个不可变的数组类,用于存储对象集合。 - **NSDictionary**:一个键值对集合,用于存储对象及其对应的键名。 #### 6. 优缺点分析 - **优点**: - **面向对象**:强大的面向对象编程能力。 - **...
2. **消息传递**:Objective-C采用消息传递机制来调用方法,这与传统过程式语言中的函数调用不同。当一个对象接收到一个消息时,它会执行相应的操作或返回结果。 3. **动态类型**:Objective-C支持动态类型,这意味...
总之,Swift调用Objective-C的可变参数函数需要对Objective-C的函数进行改造,使其接收`va_list`参数,然后在Swift中使用`withVaList`函数创建`va_list`并传递给Objective-C方法。通过这种方式,我们可以充分利用...
#### 一、Objective-C语言基础 - **类与对象**:Objective-C是一种面向对象的语言,其核心概念是类和对象。类定义了对象的行为和属性,对象则是类的一个实例。本书第一章至第七章会详细介绍类和对象的概念及其在...
- **可变参数列表**:Objective-C支持可变参数列表的方法。 - **匿名参数**:在Objective-C中,可以通过省略参数名称来实现匿名参数。 - **方法修饰符**:包括`const`、`static`、`virtual`等关键字,用于修饰方法的...
`NSString`是一个不可变的字符串对象,支持Unicode,方便进行格式化和内存管理。创建字符串可以通过直接赋值或使用`stringWithFormat:`方法: ```objc NSString *myString = @"My String"; NSString *anotherString...
1. **变量和函数重命名**:通过将有意义的变量名和函数名替换为无意义的字符串,使得阅读代码变得困难。Objective-C中可以使用宏定义、Category或Category中的方法来实现这一目的。 2. **代码混淆**:通过对代码...
Objective-C是一种面向对象的编程语言,它是C语言的超集,添加了Smalltalk风格的消息传递机制,主要用于开发苹果平台上的应用程序,包括iOS和macOS。Objective-C是在20世纪80年代由Stepanov和Moss在施乐帕洛阿尔托...