Category iOS的分类怎么实现的

·  阅读 74

一、Category简介

分类(Category)是OC中的特有语法,它是表示一个指向分类的结构体的指针。原则上它只能增加方法,不能增加成员(实例)变量。

####注意: 1.分类是用于给原有类添加方法的,因为分类的结构体指针中,没有属性列表,只有方法列表。所以原则上讲它只能添加方法, 不能添加属性(成员变量),实际上可以通过其它方式添加属性; 2.分类中的可以写@property, 但不会生成setter/getter方法, 也不会生成实现以及私有的成员变量(编译时会报警告); 3.可以在分类中访问原有类中.h中的属性; 4.如果分类中有和原有类同名的方法, 会优先调用分类中的方法, 就是说会忽略原有类的方法。所以同名方法调用的优先级为 分类 > 本类 > 父类。因此在开发中尽量不要覆盖原有类; 5.如果多个分类中都有和原有类中同名的方法, 那么调用该方法的时候执行谁由编译器决定;编译器会执行最后一个参与编译的分类中的方法。分类格式:

@interface 扩展的类(分类的名称)
@end

@implementation 扩展的名称(分类的名称)
@end
复制代码

例子:// Hex+Category.h文件中

@interface Hex (Category)
@property(nonatomic,copy) NSString *nameWithSetterGetter;
 //设置setter/getter方法的属性
@property(nonatomic,copy) NSString *nameWithoutSetterGetter;       
 //不设置setter/getter方法的属性(注意是可以写在这,而且编译只会报警告,运行不报错)
- (void) colorCategoryMethod;                                    
 //分类方法
@end
复制代码

一般在一个类中用@property声明属性,编译器会自动帮我们生成_成员变量和setter/getter,但分类的指针结构体中,根本没有属性列表。所以在分类中用@property声明属性,既无法生成_成员变量也无法生成setter/getter。最后结果:用@property声明属性,编译和运行都会通过,只要不使用程序也不会崩溃。但如果调用了_成员变量和setter/getter方法,报错就无法避免了。

二、Category创建方式

分类也叫类别创建步骤很简单如下:

1.新建一个Object-C File文件

(图1)

2.点击Next进行下一步:

(图2)

3.填好信息,点击Next一个NSString的分类就创建好了

三、Category使用范围

1.扩展已有的类。 2.引用父类未公开方法。 3.实现简单协议。 4.可以把类的实现分开在几个不同的文件里面。这样做有几个显而易见的好处,

  • a)可以减少单个文件的体积。
  • b)可以把不同的功能组织到不同的category里。
  • c)可以由多个开发者共同完成一个类
  • d)可以按需加载想要的category 等等。

5.声明私有方法。 6.模拟多继承。 7.把framework的私有方法公开。

分类:
iOS
标签:
分类:
iOS
标签: