黑马程序员---OC学习笔记之分类(Category)延展

------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文件中声明私有方法的非常好的方式

你可能感兴趣的:(Objective-C基础,分类(Category)延展)