1、类方法概述
实例方法就是一个方法,它在类的一个具体实例的范围内执行。也就是说,在你调用一个实例方 法前,你必须首先创建类的一个实例。
而类方法,比较起来,也就是说,不需要你创建一个实例。 +表示类方法,就是类调用方法,不依赖与任何对象的方法。 -表示是实例(对象)方法,只能是对象可调用,依赖与任何对象的方法。
2、类方法的调用
[类名称 类方法名称];
3、类方法使用注意事项:
1)类方法可以和实例方法同名,这个并不影响使用,实例方法由实例对象访问调用,类方法要通 过类里访问调用,不会有交叉相互影响。
声明程序:
//声明对象方法
-(int)add:(int)num1 andNum2:(int)num2;
//声明类方法
+(int)add:(int)num1 andNum2:(int)num2;
调用程序:
//通过cal对象调用其对象方法
int result=[cal add:32 andNum2:11];
//通过类名调用类方法
result= [Caculator add:22 andNum2:32];
2)类方法也可以是从父类继承而来,子类可以重写类方法,如description类方法就可以在子类 里重新定义这个方法。
3)类方法和实例方法一样在interface里声明,在implementation里实现。
4)类方法只能被类调用执行,向实例对象发送类方法是不能被触发执行的。
5)在类方法里使用了self,这个self执行的类对象class object而不是实例对象instance object。
4、类方法的优点:
1)节省内存空间
2)提高了效率
3)作为工具方法
5、类方法的易犯错误
1)在类方法中使用了类的成员变量 (在类方法中不能使用实例变量)。
在图中所示的方法是错的,程序会报错。若要使用,采用传参数的方法可以解决。
6、类方法与对象方法比较
1)对象方法:以-号开头,可以使用成员变量,用对象调用对象方法 对象方法可以调用当前对象或者其他对象的方法(是通过将对象作为参数传入方法)如下 :
----- 调用当前对象的其他方法
//通过类方法实现求两个数的平均值
-(float)avg:(Caculator *)caculator{
//调用对象方法计算两个数的和
return [caculator sumNum1:caculator->_num1 andNum2:caculator->num2]/2.0f;
}
---- 调用其他对象的方法
<span style="font-size:12px;">@implementation Person
//在人的对象方法中,调用狗的对象方法
-(void)feedDog:(Dog *)dog{
[dog eat:@"包子"];
}
@end</span>
----- 对象方法可以调用类方法
//通过类方法实现求两个数的平均值
-(float)avg:(Caculator *)caculator{
//调用类方法计算两个数的和
return [Caculator sumNum1:caculator->_num1 andNum2:caculator->num2]/2.0f;
}
2)类方法:以+开头 不可以使用成员变量 。
--- 用类名调用类方法
//通过类方法实现求两个数的平均值
+(float)avg:(int)num1 andNum2:(int)num2{
//调用类方法计算两个数的和
return [Caculator sumNum1:num1 andNum2:num2]/2.0f;
}
---类方法可以调用对象方法(是通过将对象作为参数传入方法)和类方法
//通过类方法实现求两个数的平均值
+(float)avg:(Caculator *)caculator{
//调用对象方法计算两个数的和
return [caculator sumNum1:caculator->_num1 andNum2:caculator->num2]/2.0f;
}
----类方法不可以调用自身,会造成死循环
+(void)test{
NSLog(@"调用类自身的方法");
[Calculator test];
}
同名方法的区别: 可以通过方法名前面的+ - 号区分。
7、OC类方法应用场景
如果我们调用一个方法,该方法中不需要使用成员变量,那么我们可以将该方法声明为类方法 [Car run]。