————————Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———————
OC中方法分为对象方法与类方法,从名称中就能体会到这两种的主要区别就是一个是针对对象要实现的方法,另一个是针对类要实现的方法。下面我们来看一下这两种方法分别怎么用,在哪里使用。
1.对象方法与类方法的创建
@interface Person : NSObject
{//定义成员变量
@public
int _age; //年龄
NSString *_name; //姓名
}
+ (void)nameOfClass;
- (void)eat;
@end
@implementation Person
+ (void)nameOfClass
{
NSLog(@"这个类的类名叫Person");
}
- (void)eat
{
NSLog(@"吃了一顿饭");
}
@end
上面的程序可以看出,两种方法的写法是略有不同的。+开头的是类方法,-开头的时对象方法。
那么这两个方法在main函数中又是如何调用的呢?调用方法如下:
int main()
{
//创建新对象p
Person *p = [[Person alloc] init];
//给p所指向的对象发送一个eat消息
[p eat];
//调用类方法
[Person nameOfClass];
return 0;
}
我们看上面程序,再结合对象方法和类方法的命名,就明白了。当要调用对象方法时,需要先创建一个新的对象,再用对象才能发送消息。而类方法却不需要,是直接利用类名调用类方法的。
所以,我们总结出一个重要的规律:
对象方法:是通过对象来调用的。
类方法:是通过类来调用的。
拓展思考:
那为什么要区分对象方法和类方法呢?
这是由于类方法和对象方法的存储空间不同所导致的。我们知道,类和对象是存在不同的存储区间的,一个在静态区,一个在堆内,方法是存放在静态区的,类的方法可以直接访问,对象的方法则要通过 isa 来间接访问。所以就必须有两个不同的方法来调用。
另外,在实际的使用中有的方法必须通过类方法来实现,比如对象的创建本身也是一个方法(alloc存储分配),调用这个方法的时候,对象还没创建出来;有的方法则不需要创建对象,比如我们创建一个数学函数库,内部不设计个性化的属性,这自然也就不需要创建对象来浪费空间,这样也就需要用到类方法。
2.对象方法细节
对象方法的创建比较自由,可以直接调用对象属性,当然,不调用对象属性也是可以的。能用类方法创建的方法,用对象方法也能创建,创建方法与类方法类似。
- (返回值类型)含参数A的类方法名:(参数A类型)参数A 参数B名称:(参数B类型)参数B ... { 代码 }
例如:
- (void)compareWithOther:(NSString *)str
{
NSLog(@"%@,%@", self->name, str);
}
有时候,在对象方法中我们需要传入一些参数进行比较。
3.类方法细节
由于类方法中只有类,没有对象,所以不能获取对象中的属性。因此不能够直接访问对象中的成员变量,因此我们在没有成员变量的工具类的类对象中,我们一般都用类方法来描述我们的行为。这样执行效率更高。
例如:
类方法的创建格式如下:
+ (返回值类型)含参数A的类方法名:(参数A类型)参数A 参数B名称:(参数B类型)参数B ... { 代码 }
+ (double)sumA:(double)a andB:(double)b{ // 注意这里的参数是从外部访问的
return a + b;
}
总结一些类方法的好处和使用场合:
1)类方法不依赖于对象,执行效率高。
2)能使用类方法的尽量用类方法实现。
3)使用场合:当方法内部不需要使用到成员变量时,就可改用类方法。
4)另外,可以允许类方法与对象方法同名!