------Java培训、Android培训、iOS培训、.Net培训--------
1、类的延展的概念
延展类别又称为【扩展Extendsion】
是Category的一个特例
其名字为匿名(空)
例如
@interface MyClass(){//扩展
float value;
}
这种写法的类别叫做【匿名类别】,又叫类扩展,所谓的扩展,其实就是一个类添加额外的成员变量,方法或者合成属性
2、延展的实现
【可以在延展中,定义实例变量】
【不能使用@implementation类名()去实现类别的方法,要直接写在类的实现中】
例如:
【Person.h文件内容】
@interface Person : NSObject
@end
【Person_age.h文件内容】这个事延展头文件
#import "Person.h"
//分类扩展
@interface Person(){
int _age;
}
@property(nonatomic,assign) int age;
-(void)printAge;
@end
【Person.m文件内容】
#import "Person.h"
#import "Person_age.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Person *p = [Person new];
p.age = 22;
[p printAge];
}
return 0;
}
打印结果;
2015-10-07 11:44:17.014分类扩展[923:303] age = 22
3、延展类可以定义私有方法
【在.m文件中使用延展】
例如:
@interface Person(){
float _weight;//定义私有成员变量
}
@property(nonatomic,assign) float weight;
//定义相对私有方法
-(void)printWeight;
@end
@implementation Person
//分类延展方法在原类的实现区实现
-(void)printAge{
NSLog(@"age = %d",self.age);
}
//实现私有方法,该方法只能在该文件中使用
-(void)printWeight{
NSLog(@"age =%.2f",self.weight);
}
@end
4.类别与类扩展的区别
1)类别只能增加方法
2)类扩展不仅可以增加方法,还可以增加实例变量(或者合成属性),只是该实例变量默认类型是私有的(作用范围只能在自身类,而不是子类或其他地方)
3)类扩展中声明的方法没有被实现,编译器会报警,但是【类别】中的方法没有被实现时编译器是不会有任何警告的,这是因为【类扩展】是在编译阶段被添加到类中的,而类别是在运行时添加到类中的
4)类扩展不能像类别那样拥有独立的【实现部分@implementation部分】,也就是说,【类扩展】所声明的方法必须依托对应类的实现部分来实现
5)定义在.m文件中的类扩展方法为私有的,定义在.h文件中的类扩展方法是共有的,【类扩展】是在.m文件中声明私有方法的非常好的方式