最近有的朋友问我这个类方法和实例方法的区别,在这就总结下吧,参考了一些文档。
OC里面既有实例方法也类方法。类方法(Class Method) 有时被称为工厂方法(Factory Method)或者方便方法(Convenience method)。工厂方法的称谓明显和一般意义上的工厂方法不同,从本质上来说,类方法可以独立于对象而执行,所以在其他的语言里面类方法有的时候被称为静态方法。
1、区别
“-“开头的是实例方法 “+”开头的是类方法,实例方法用实例对象访问,类方法的对象是类而不是实例,通常创建对象或者工具类。
静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,
所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。
静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,
而且静态内存是有限制的,太多了程序会启动不了。
2、使用场景
如果需要访问或者修改某个实例的成员变量时,将该方法定义成实例方法。
类方法正好相反,它不需要访问或者修改某个实例的成员变量。
类方法一般用于实现一些工具方法,比如对某个对象进行扩展,或者实现单例。
3.注意点
// 类方法
+(Student *)studentWithID:(NSInteger)ID name:(NSString *)name gender:(NSString *)gender
{
Student *stu =nil;
if (stu ==nil) {
// 类方法不可以使用实例变量。
// 不可以直接使用self.name
stu.name = name;
stu.ID = ID;
stu.gender = gender;
// 类方法可以调用类方法。
// 类方法可以使用self,因为self不是实例变量。类方法里面的self,是Class.
[selfgo];
// 类方法不可以调用实例方法,但是类方法可以通过创建对象来访问实例方法。
Student *abc = [[Studentalloc] init];
[abc plays];
}
return stu;
}
// 实例方法
-(void)plays {
// 实例方法里面的self,是对象的首地址。
self.name =@"讲解";
}
// 类方法
+(void)go {
NSLog(@"调用了");
}