1.类的方法
类的方法和C语言的函数不同,其在逻辑上要么属于类,要么属于对象。即所有的方法必须使用[类 方法](“+”号方法)或者[对象 方法](‘-’号方法)的形式来调用。
如果在定义方法时,最后一个参数名后面增加逗号和三点(,...),即表明该方法可以接受多个参数值。
#import <Foundation/Foundation.h>
@interface Person : NSObject<NSCopying>
{
NSString * _name ;
int _age ;
}
@property (nonatomic,retain)NSString * name;
@property (nonatomic,assign)int age ;
-(void)test:(NSString * ) name ,...; //定义行参个数可变的方法
//-(void)printInfo;
//+(void)personInfo ;
@end
为了在程序中获取可变的行参,需要使用以下关键字。
va_list:这是一个类型,用于定义指向可变参数列表的指针变量。
va_start:这是一个函数,该函数指定开始处理可变形参的列表,并让指针变量指向可变行参列表的第一个参数。
va_end:结束处理可变形参,释放指针变量。
va_arg:该函数返回获取当前指针指向的参数值,并移动到下一个参数。
#import "Person.h"
@implementation Person
-(void)test:(NSString *)name, ...
{
va_list argList ; //使用va_list定义一个指针变量,指针变量指向可变参数列表
if (name) //如果第一个name参数存在,才需要处理后面的参数
{
NSLog(@"%@",name); //由于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);
}
}
@end
一个方法中只能包含一个个数可变的形参,且在形参列表的最后。
2.类的方法
oc的成员变量都是实例变量,并不支持真正的类变量。系统会为实例变量初始化。@interface Person : NSObject<NSCopying>
{
NSString * _name ;
int _age ;
}
实例变量分为 public(公有的,可以在类的外部和内部操作) protected(默认,只能在该类和其子类内操作) privated(私有的,只能在该类内访问)。
单例:如果一个类始终只能创建一个实例,则这个类被称为单例类。实现如下:
#import "Person.h"
static id instance = nil;
@implementation Person
+(id)instance
{
if (!instance) {
instance = [[super alloc]init];
}
return instance ;
}
@end
#import <Foundation/Foundation.h>
@interface Person : NSObject<NSCopying>
{
NSString * _name ;
int _age ;
}
+(id)instance;
@end
定义一个static全局变量,并通过该全局变量缓存已经有的实例,然后实现instance类方法,该方法控制类最多只产生一个实例。