-----------Java培训、Android培训、IOS培训、.Net培训、期待与您交流!------------
本节讨论OC中类方法和对象方法的创建和使用。
什么是类方法,什么是对象方法呢?简单来讲,类方法是直接通过类访问的方法,对象方法是通过对象来访问的方法。
1、类方法和对象方法的创建
类方法通过在方法前面加 “+” 符号创建,对象方法通过在方法前面加 “-”创建。如下所示:
@interface Dog : NSObject
{
@public
NSString *name; // 对外的属性
}
+ (void)descriptionAboutDogClass; // 类方法
- (void)bark; // 对象方法
@end
@implementation Dog
// 类方法实现
+ (void)descriptionAboutDogClass{
NSLog(@"This is a Dog class");
}
// 对象方法实现
- (void)bark{
NSLog(@"Wowow!(I am %@)", name);
}
@end
我们来看看这两种方法的调用有什么区别:
[Dog descriptionAboutDogClass]; // 类方法可以通过类名直接调用
Dog *d=[Dog new]; // 创建对象
d->name=@"Wangcai"; // 对象初始化
[d bark]; // 对象方法通过对象才能调用
我们可以看出,这两者的主要区别就在于是谁在调用这个方法:
类方法:通过类来调用
对象方法:通过对象来调用
2、为什么要有类方法和对象方法?
① 我们知道,类和对象是存在不同的存储区间的,一个在静态区,一个在堆内,方法是存放在静态区的,类的方法可以直接访问,对象的方法则要通过 isa 来间接访问。这就必然导致两种方法的存在;
② 为什么要使用类方法?在实际的使用中有的方法必须通过类方法来实现,比如对象的创建本身也是一个方法(alloc存储分配),调用这个方法的时候,对象还没创建出来;有的方法则不需要创建对象,比如我们创建一个数学函数库,内部不设计个性化的属性,这自然也就不需要创建对象来浪分空间,这样也就需要用到类方法。举例如下:
@interface Math : NSObject
+ (double)get_pi; // 返回pi值
+ (double)sumA:(double)a andB:(double)b; // 计算两数的和
@end
@implementation Math
+ (double)get_pi{
return 3.1415926;
}
+ (double)sumA:(double)a andB:(double)b{
return a + b;
}
@end
当然实际上不会写这么简单的函数,有更复杂的应用。
3、类方法细节
由于类方法是在对象创建之前使用的,因此对象的属性是不能直接内部访问的。也就是说,不在内部直接调用对象属性的方法,我们可以(注意是可以,不是必须)定义成类方法。
类方法的创建格式如下:
+ (返回值类型)含参数A的类方法名:(参数A类型)参数A 参数B名称:(参数B类型)参数B ... { 代码 }
+ (double)sumA:(double)a andB:(double)b{ // 注意这里的参数是从外部访问的
return a + b;
}
返回值可以是void,参数名称可以省略(冒号不可),但是不建议这样做,这些用于标识方法的名称(包括冒号)合在一起,构成完整的方法名(上面一行代码的方法名为:sumA:andB)。方法名的定义要尽量规范、通俗易懂。
4、对象方法细节
对象方法的创建比较自由,可以直接调用对象属性,当然,不调用对象属性也是可以的。能用类方法创建的方法,用对象方法也能创建,创建方法与类方法类似。
- (返回值类型)含参数A的类方法名:(参数A类型)参数A 参数B名称:(参数B类型)参数B ... { 代码 }
- (void)selfIntroduceWithString:(NSString*)string{
NSLog(@"My name is %@, and %@",
self->name, // 直接调用属性
string); // 调用参数,注意参数和属性不是一个概念
}
5、引出一个疑问
对象创建的alloc方法没有接收任何参数,他怎么能在不知道属性参数的情况下,为属性分配空间呢?他显然要了解要创建的各个属性的特点!但是这些属性的特点他是从静态代码区读取到的,这和直接读取属性的值是两个概念。
-----------Java培训、Android培训、IOS培训、.Net培训、期待与您交流!------------