Category详解

什么是Category

类别是Objective-C的一项功能,可扩展类的接口,而无需对类进行子类化。category 可以为已经存在的类增加方法,而不需要增加一个子类。而且,我们可以在不知道某个类内部实现的情况下,为该类增加方法。和子类不同的是,Category不能用于向被扩展类添加实例变量,所以Category通常作为一种组织框架代码的工具来使用。如果我们想增加某个框架(framework)中的类的方法,category 就非常有效。


Category的用途

1. 在不创建继承类的情况下实现对已有类的扩展。

2. 简化类的开发工作(当一个类需要多个程序员协同开发的时候,Category可以将同一个类根据用途分别放在不同的源文件中,从而便于程序员独立开发相应的方法集合)。

3. 将常用的相关的方法分组。

4. 在没有源代码的情况下可以用来修复BUG。


Category的用法

比如,如果想在NSString 上增加一个方法,那么就可以这样做:

@interface NSString (extension)
-(void) method;
@end

上面的声明通常是在.h文件中,然后我们在.m文件中实现这些方法:

@implementation NSString(extension)  

-(void) method{
     ……
}
@end

这个时候就可以在NSString类的对象上调用这个方法了。

注意:类别并不能为类声明新的实例变量,他只包含方法。然而在类作用域内所有实例变量,都能被这些类别访问。他们包括为类声明的所有的实例变量,甚至那些被@private 修饰的变量。可以为一个类添加多个类别,但每个类别名必须不同,而且每个类别都必须声明并实现一套不同的方法。

我们通过 category 来修改一个类的时候,他对应应用程序里这个类所有对象都起作用。跟子类不一样,category 不能增加成员变量。我们还可以用 category里重写类原先存在的方法(但是并不推荐这么做)。

可以将类别作为一种手段,对头文件中的相关方法声明进行分组,甚至还可以将不同的类别声明放在不同的头文件中,框架在其所有的头文件中使用这些技巧达到清晰明确的效果,还可以使用称为类别扩展的匿名类别,在实现文件(.m)文件中声明专有的属性和专有的方法。


代码组织

Category用于大型类有效分解。通常一个大型类的方法可以根据某种逻辑或是相关性分解为不同的组,一个类的代码量越大,将这个类分解到不同的文件中就显得越有用,每个文件中分别是这个类的某些相关方法的集合。

当有多个开发者共同完成一个项目时,每个人所承担的是单独的cagegory的开发和维护。这样就版本控制就更加简单了,因为开发人员之间的工作冲突更少了。


Category VS添加子类

并没有什么界限分明的判定标准来作为何时用Category何时用添加子类的方法的指导。但是有以下几个指导性的建议:

如果需要添加一个新的变量,则需添加子类。如果只是添加一个新的方法,用Category是比较好的选择。  


category的作用

a) 将类的实现分开在几个不同的文件中

b) 声明私有方法

c) 模拟多继承

d) 把framework的私有方法公开


category与extension的异处

extension是编译器决议,和类的头文件里的@interface以及实现文件里面的@implement一起形成一个完整的类。你必须用一个类的源码才能为它extension,比如你无法为NSString添加extension。

category是运行期决议的。

所以extension可以添加实例变量,而category作为运行期决议是无法添加实例变量,因为会破坏类的内存布局。


运行时categrory

众所周知,运行时,OC几乎所有的内容都是以结构体的形式存在的。catrgory也不例外。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值