OC分类(Category)

Category 分类 ,又称为类别、类目

概念

1 Category有多种翻译:分类、类别、类目(一般叫分类的多)
2 Category式OC特有的语法,其他语言没有的语法(类似于C#语言中的"扩展方法"和partial 关键字

作用

1 在不修改原有类的基础上增加新的方法
2 一个庞大的类可以分模式开发
3 一个庞大的类可以由多个人来编写,更有利于团队合作

使用Category的作用

1 1)对现有类进行扩展
2     比如,你可以扩展Cocoa touch框架中的类,你在列表中增加的方法会被子类所继承,而且在运行时跟其他的方法没有区别
3 2)作为子类的替代手段
4     不需要定义和使用一个子类,你可以通过Category直接向已有的类里增加方法
5 3)对类中的方法归类
6     利用category把一个庞大的类划分为小块来分别进行开发,从而更好地对类中的方法进行更新和维护

使用category的步骤

声明--->实现---->使用

注意:类别的命名规则
                类别+扩展方法,如"NNString+countNum"
    类别的接口声明与类的定义十分相似,但类别不继承父类,只需要带有一个括号,表明该类别的主要用途

category声明

 1 在.h文件中,声明类别:
 2
 3     @interface ClassName(CategoryName)
 4             NewMethod;   //在类别中添加方法
 5             //不允许在类别中添加变量
 6     @end
 7
 8
 9     说明:
10         声明类别格式:
11                     1)新增加的方法必须在写@interface 与 @end之间
12                     2)ClassName 现有类的类名(要为哪个类扩展方法)
13                     3)CategoryName 待声明的类别名称
14                     4)NewMethod 新增加的方法
15       注意:
16                     不允许在声明类别的时候定义变量

category实现

 1 在.m文件中(也可以在.h中实现),实现类别:
 2 @implementation ClassName(CategoryName)
 3 NewMethod{
 4      ......
 5 }
 6 @end
 7
 8     说明:
 9         实现类别格式
10             1)新方法的实现必须写在 @implementation 与@end之间
11             2)ClassName 现有类的类名
12             3)CategoryName 待声明的类别名称
13             4)NewMethod 新增加的方法的实现

1.

2.

3.

也可以通过图形界面生成类别

1.

2.

3.

分类的使用注意事项

1 1)分类只能增加方法,不能增加成员变量、@property(可能编译不报错,但是运行有问题)
2 2)分类可以访问原来类中的成员变量
3 3)如果分类和原来类出现同名方法,优先调用分类中的方法,原来类中的方法会被忽略
4 4)方法调用的优先级(从高到低)
5 分类(最后参与编译的分类优先),只要有分类就优先调用分类,不考虑与主类的编译顺序

分类的编译顺序

最下面的最后编译

Category的非正式协议

 1 非正式协议:
 2         非正式协议就是给NSObject类创建的类目又叫做非正式协议,非正式协议一般不需要进行实现,一般在子类中进行方法的重写.
 3
 4 例如:
 5     #import "NSObject+run.h"
 6
 7     @implementation NSObject (run)
 8     -(void)run{
 9         NSLog(@"NSObject run");
10     }
11     @end
12
13     然后写个Student 继承与NSObject
14     这样Student就可以直接运行 run方法
15     Student  *stu = [Student new];
16     [stu run];
17
18 这就是非正式协议

Category延展

 1 概念:
 2     延伸类别又称为扩展(Extendsion)(也可以理解为匿名类别)
 3     Extension是Category是一个特例
 4     其名字为匿名(为空),并且新增加的方面一定要予以实现.(Category没有这个限制)
 5         例如: @interface Student()
 6                 @end
 7
 8 实现:
 9     通过延展来实现方法的私有,延展的头文件独立.这种方法不能实现真正的方法私有,当在别的文件中引入延展的头文件,那么在这个文件中定义的类的对象就可以直接调用在延展中定义所谓私有的方法
10       //对类的延展-隐藏方法 wrap的一种手段(非强制)
11         .h文件
12         @interface SceneManager()
13             +(void)wrap;
14         @end
15
16         .m文件
17         @implementation SceneManager
18         +(void)wrap{
19                   .....
20         }
21         @end
22
23 调用:
24     [SceneManager wrap];
25     //这里会报一个警告: Class method of "+wrap" not found
26     //不过虽然是警告,不过运行是正常的,不过这么写得自我规范上不好,即使编译器没有做强制限制,我们自己也要限制自己
27     //不然,延展方法就毫无意义可言
28
29 第二种实现:
30     延展的方式是延展没有独立的头文件,在类的实现文件.m中声明和实现延展,这种方法可以很好地实现方法的私有,因为在OC中是不能引入.m的文件的
31
32     .m文件
33     @interface SceneManager()
34     +(void)wrap;
35     @end
36     @implementation SceneManager
37     +(void)wrap{
38          ......
39     }
40     @end
41
42      调用
43     [SceneManager wrap];
44
45 第三种实现:
46     私有的方式是在.m文件中得@implementation中直接实现在@interface中没有声明的方法,这样也可以很好的实现方法的私有
时间: 2024-08-29 04:33:54

OC分类(Category)的相关文章

黑马程序员---OC基础7【ARC概念】【ARC对象内存管理】【分类Category】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [ARC概念]   1.指针的分类 1)强指针,默认的情况下,所有的指针都是强指针,关键字strong: 2)弱指针,_ _weak关键字修饰符的指针 2.ARC概念 自动引用计数 永远不要写retain和release.autorelease三个关键字 编译器会在编译的时候自动插入retain和release.autorelease, 是一个编译器的特性:“垃圾回收”是运行时的特性 3.ARC工

黑马程序员-OC特有语法:分类category,给NSString增加方法计算字符串中数字的个数

1:分类的使用场景:想对一个类,扩充一些功能,而又不改变原来类的模型,也不用继承,这时OC中的特有语法:分类可以做到: 当然分类也是一个类,也需要声明和实现,声明在.h文件中,实现在.m文件中,格式如下 // 声明 @interface  类名  (分类名称) @end // 实现 @implementation 类名 (分类名称) @end 2:分类的好处,当一个类比较庞大时,不同的部分可以放到不同的分类中,也方便团队中类的开发: 3:分类使用注意: a:分类不能增加成员变量,只能对原类增加方

Arc 自动内存管理 分类Category 类扩展 Block 代码段 和 Protocol协议的一些简单知识的总结

1. Arc的使用 Arc是自动内存管理: arc的使用原则 1).只要对象没有任何强类型指针引用就会被释放’. 2).只要对象被任何强类型指针指引就不会被释放. 弱指针:__weak 被__weak修饰的指针就被称为弱型指针: 强类型指针 默认的指针都是强类型指针: 被__strong修饰的指针也是强类型指针. 使用Arc时可以重写dealloc方法,但是在重写方法时不能手动调用[super dealloc]: 在Arc中通过@property生成的属性如果是OC的对象那么要用Strong来修

Objective-C 分类Category

OC提供了一种可以在不修改类的源码基础上,扩展类的方法的功能,"分类"Category,这个机制和C#中的扩展方法类似,一般用于在不方便修改类的源码时(如OC系统相关的类库),但有有需求要拓展类的方法,可以使用分类来实现. Java中应该是没有提供相关的机制,但是Java可以通过动态代理来实现AOP,在切入点前后执行代码逻辑,个人认为比OC还要方便. // // Girl.h // 10_Category // // Created by apple on 14/12/23. // C

OC分类

为现有类(一般是系统类)扩展一些新的方法,而不通过子类继承 以上为例,自动创建出两个文件 NSString+AddMethod.h 1 #import <Foundation/Foundation.h> 2 3 4 @interface NSString (AddMethod) 5 6 7 @end NSString+AddMethod.m 1 #import "NSString+AddMethod.h" 2 3 4 5 @implementation NSString (

我眼中的 OC【category】 用法细节以及注意点

最近空闲的时候在看OC的面向对象特性,作为Apple的当家开发语言(请暂且忽略swift小兄弟,呵呵),OC近几年可谓风光无限.不过说真的,OC的确有他的美妙之处,一旦用到熟练就会发现OC其实非常顺手通俗.对于他的面向对象特性,“消息机制”.“Protocol”.“Catagory”,这三者绝对是三员大将,也是学习OC必须要掌握的技能.本文将从我个人的视角对catagory的理解,做简单的用法讲解. 另外,对于这三者的使用频率一般来说是,“消息机制”>“Protocol”>“Catagory”

关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol

关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol 2014-02-18 19:57 315人阅读 评论(0) 收藏 举报 1.category,覆盖原类的方法,即使不引用该category头文件,也能覆盖,respondsToSelector:方法也能响应.2.category,不可以有私有变量,但是可以有@property的声明,property的声明只是声明了该类的set,get方法(需要引用该category的头文件),但是categ

Objective-C分类 (category)和扩展(Extension)

1.分类(category) 使用Object-C中的分类,是一种编译时的手段,允许我们通过给一个类添加方法来扩充它(但是通过category不能添加新的实例变量),并且我们不需要访问类中的代码就可以做到,这点和javascript中使用原型来定义属性有点类似. 我们可以为一个类创建一个新的方法,而不需要在代码中编辑类定义. 下面就是定义并使用分类的例子程序,通过下面代码,我们可以给Object-C中的NSString 添加camelCaseString分类,使用camelCaseString方

Objective-C:分类(Category、extension)

分类(Category .Extension) (一)分类的划分 (2) 1.(命名的类别)类别Category:只能添加新的方法,不能添加新变量. 2.(未命名的类别)类的扩展Extension://扩展一般直接写在类的实现文件中     //扩展中定义的都是类中私有的实例变量和方法 (二)分类的使用 (1)分类只能增加方法(包括类方法和对象方法),不能增加成员变量 (2)在分类方法的实现中可以访问原来类中的成员变量: (3)分类中可以重新实现原来类中的方法,但是会覆盖掉原来的方法,导致原来的