------- <a href="http://www.itheima.com" target="blank">Windows Phone 7手机开发</a>、<a href="http://www.itheima.com" target="blank">.Ios培训</a>、期待与您交流! -------
oc中的分类,与该类既不是继承关系,也不是组合关系,它是类的一种补充。分类有着它特殊的的作用,分类可以在不改变原来类的内容的基础上,增加类的一些方法。
代码演示:
main函数:
import <Foundation/Foundation.h>
#import "Animal.h"
#import "Animal+twh.h"
int main()
{
Animal *a = [[Animal alloc] init];
[a run];
return 0;
}
Animal+twh.h:
#import "Animal.h"
@interface Animal (twh)
- (void)run;
@end
Animal+twh.m:
#import "Animal+twh.h"
@implementation Animal (twh)
- (void)run
{
NSLog(@"The animal is running......");
}
@end
首先从分类的命名上可以看出,一般情况分类后面可以以程序开发者的名字的首个拼音字母作为开头,创建好的分类,在编译器里面的名字为 类名+分类名。头文件为.h文件,可以执行文件为.m文件。更多情况下,是以该分类实现的类容而命名,这样直观简洁。
接着,需要注意的是,在main函数中必须得写上分类的.h,如 #import"Animal+twh.h"。为什么是写.h文件而不是写为.m文件呢。这是因为在点击运行程序时,xcode会将这个文件夹中的所有.m文件都一起加载起来运行,main函数也为一个.m文件。如果在main里面写入.m的头文件,则会出现报错,报重复写入.m文件的错误。
由上面的代码演示,xcode的现实结果,可知,类对象可以直接调用分类中的方法,与调用类中的方法,在代码的写法上是一样的。但是需要注意的事,若分类中与类中拥有同样名字的方法时,分类中的方法会覆盖掉类中原有的方法。
例如:
main函数:
#import <Foundation/Foundation.h>
#import "Animal.h"
#import "Animal+twh.h"
int main()
{
Animal *a = [[Animal alloc] init];
[a check];
return 0;
}
Animal.m:
#import "Animal.h"
@implementation Animal
- (void)check
{
NSLog(@"perform the Ainmal's check method......");
}
@end
Animal+twh.m:
#import "Animal+twh.h"
@implementation Animal (twh)
- (void)run
{
NSLog(@"The animal is running......");
}
- (void)check
{
NSLog(@"perform the Ainmal+twh's check method......");
}
@end
打印结果为:
一般情况下,并不提倡在分类中写与类中同名的方法,这样会覆盖掉原类中的方法。若一个类同同时拥有多个分类时,并且不同分类中拥有同名的方法时,调用方法时,会执行类中的方法?还是某一个分类中的方法呢?
有一个原则不变的是,调用的优先级为:分类---->类---->父类。因此上面所说的情况,会执行分类中的方法,但是执行哪个分类中的方法呢?此时,遵循的是,执行最后一个编译的.m文件的分类中的方法。我们可以打开xcode,查看编译的顺序。
例如:
由上图可知,最后一次编译的是Animal+twh.m,那么执行的将是这个分类中的同名的方法。
最后需要注意的是,分类是不能增加原来类的成员变量的,只能增加方法,(类方法与对象方法都可以增加),分类的方法的实现中,是可以访问原来类中的成员变量的。