------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———
类方法及匿名类
1、类方法概述
实例方法就是一个方法,它在类的一个具体实例的范围内执行。也就是说,在你调用一个实例方法前,你必须首先创建类的一个实例。
而类方法,比较起来,也就是说,不需要你创建一个实例。
+表示类方法,就是类调用方法,不依赖于任何对象的方法。
-表示是实例(对象)方法,只能是对象可调用,依赖与于何对象的方法。
2、类方法的调用
[类名称 类方法名称];
3、类方法使用注意事项:
1)类方法可以和实例方法同名,这个并不影响使用,实例方法由实例对象访问调用,类方法要通过类来访问调用,不会有交叉相互影响。
2)类方法也可以是从父类继承而来,子类可以重写类方法,如description类方法就可以在子类里重新定义这个方法。
3)类方法和实例方法一样在interface里声明,在implementation里实现。
4)类方法智能被向类发送类方法消息才被执行,向实例对象发送类方法是不能被触发执行的。
5)在类方法里使用了self,这个self执行的类对象class Object而不是实例对象instance Object。
4、类方法的优点
1)节省内存空间
2)提高了效率
3)作为工具方法
5、类方法的易犯错误
1)在类方法中使用了类的成员变量
6、类方法与对象方法比较
1)对象方法:
以-号开头
可以使用成员变量
用对象调用对象方法
对象方法可以调用当前对象或者其他对象的方法(是通过将对象作为参数传入方法)如下
调用当前对象的其他方法:
调用其他对象的方法
对象方法可以调用类方法
2)类方法
以+开头
不可以使用成员变量
用类名调用类方法
类方法可以调用对象方法(是通过将对象作为参数传入方法)和类方法
类方法不可以调用自身,会造成死循环
同名方法的区别:
通过同名方法前面的+ - 号区分
7、OC类方法应用场景
如果我们调用一个方法,该方法中不需要使用成员变量,那么我们可以将该方法声明为类方法
@interface Calculator :NSObject
{
int _result;
int _num1;
int _num2;
}
//声明一个类方法用于计算两个数的和
+(int )sumNum1:(int )num1 andNum2:(int )num2;
@end
@implementation Calculator
//通过类方法计算两个数的和
+(int )sumNum1: (int )num1 andNum2:(int )num2 {
return num1 + num2;
}
@end
8、匿名类的概念
定义如下类:
#pragma mark 车类的声明
@interface Car :NSObject
{
@public
int _color;
}
- (void)run; //车启动
- (void)stop; //车停止
@end
#pragma mark 车类的实现
@implementation Car
//车启动
- (void)run{
NSLog(@“Car Start! color:%d”, _color);
}
//车停止
- (void)stop{
NSLog(@“Car Stop!”);
}
#pragma mark 人类的声明
@interface Person :NSObject
{
NSString * _name ;
int _age;
}
//人开车回家
- (void)goHome:(Car *)car;
@end
#pragma mark 人类的实现
@implementation Person
- (void)goHome:(Car *)car{
//车启动了
[car run];
}
@end
9、匿名类访问变量
发现虽然我们给_color进行赋值了,但是打印出来以后还是0,
原因如下:
10、匿名类调用方法
11、匿名类作为方法的参数
1)匿名类作为方法的参数
2)匿名类优缺点
优点:可以简化代码,方便方法调用
缺点:匿名对象实例化以后,只能正确的使用成员变量一次
常见用法:
//下面两句的作用是等价的
Person *p = [[Person alloc] init];
Person *p1 = [Person new];
两者的区别:
alloc 和 init 分别把分配内存和初始化的工作分开。这样更加的灵活,可以自行初始化对象的成员变量值
而不像new每次都初始化为0
new是把分配内存和初始化的工作一起完成了,先分配内存,然后调用类的构造函数。