objective-c 的方法不能独立存在,所有的方法都必须定义在类里,
IOS 开发学习总结objectivec面向对象之——方法
。方法在逻辑上,要么属于类,要么属于对象。方法的所属性
不难发现,方法在语法上和功能上,方法与函数很相似。其实,方法是由传统的函数发展而来的。
objective-c 调用函数时的传参机制和调用方法时的传参机制是一样的,都是值传递,都是传入参数的副本。
方法与传统的函数的显著不同:
在结构化编程语言里,函数是一等公民。整个程序是由一个一个函数组成;
面向对象的语言里,类是一等公民。因此在 OC 里方法不能独立存在,必须属于类或者对象。
由于 objective-c 里的方法不能独立存在,也不能像函数那样独立执行,执行方法时必须使用类或者对象作为调用者。
由上,objective-c 中方法的所属性主要体现在下面的3个方面:
1. 方法不能独立定义,只能在类体里定义。
2. 方法在逻辑上,要么属于类,要么属于对象。
3. objective-c 里的方法不能独立存在,也不能像函数那样独立执行,执行方法时必须使用类或者对象作为调用者。
形参个数可变的方法
如果在定义方法时,在最后一个形参名后增加逗号和三点(,…),就表明该形参可以接受多个参数值。
为了在程序中获取个数可变的形参。需使用如下关键字:
- va_list:这是个用于定义指向可变参数列表的指针变量。
- va_start:这是个函数。指定开始处理可变形参的列表,并让指针变量指向可变形参列表的第一个参数。
- va_end:结束处理可变形参,释放指针变量。
- va_arg:该函数返回指针当前指向的参数的值,并将指针移动到指向下一个参数。
如下示例程序:
头文件:VarArgs.h
<code class="hljs" r="">#import<foundation foundation.h="">@interface VarArgs : NSObject// 定义形参个数可变的方法- (void)test:(NSString *) name, ...;@end</foundation></code>
实现文件:VarArgs.m
<code class="hljs" bjectivec="">#import VarArgs.h@implementation VarArgs- (void)test:(NSString *) name, ...{ // 使用va_list定义一个argList指针变量,该指针变量指向可变参数列表 va_list argList; // 如果为第一个name参数存在,才需要处理后面的参数 if (name) { // 由于name参数并不在可变参数列表中,因此先处理name参数 NSLog(@%@ , name); // 让argList指向第一个可变参数列表的第一个参数,开始提取可变参数列表的参数 va_start(argList, name); // va_arg用于提取argList指针当前指向的参数,并将指针移动到指向下一个参数 // arg变量用于保存当前获取的参数,如果该参数不为nil,进入循环体 NSString* arg = va_arg(argList, id); while (arg) { // 打印出每一个参数. NSLog(@%@,arg); // 再次提取下一个参数,并将指针移动到指向下一个参数 arg = va_arg(argList, id); } // 释放argList指针,结束提取 va_end(argList); }}@endint main(int argc , char * argv[]){ @autoreleasepool{ VarArgs* va = [[VarArgs alloc] init]; [va test:@疯狂iOS讲义 , @疯狂Android讲义, @疯狂Ajax讲义 , nil]; }}</code>
本质上说,这个可变参数也是个类似数组的结构,