iOS - Category and Extension

来源:互联网 发布:北京点知教育 编辑:程序博客网 时间:2024/05/19 15:21

Category(类别)

一、概述
类别是一种为现有的类添加新方法的方式。
利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可以为任何已经存在的class添加方法,包括那些没有源代码的类(如某些框架类)。

二、示例

1、声明类别
示例1.

@interface NSString (CategoryDemo)-(NSNumber*) lengthAsNumber;@end

示例2.

@interface  MyObject(categoryDemo){    int icategory;    // error: Ivarsmay not be placed in categories}-(void)testInCategory;// 不强制要求在类的mainimplementation中实现@end

2、实现类别
示例1.

@implementation NSString (CategoryDemo)-(NSNumber*) lengthAsNumber{    NSUInteger length = [self length];    return ([NSNumbernumberWithUnsignedInt: length]);}@end

示例2.

implementation@implementation MyObject-(void)testInCategory{}@end

3、调用:

NSMutableDictionary *dic =[NSMutableDictionarydictionary];[dicsetObject: [@"Hello"lengthAsNumber]forKey:@"hello"];[dic setObject: [@"World!" lengthAsNumber] forKey: @"world"];NSLog(@"%@", dic);

4、打印结果:
2016-10-27 17:43:32.993CategoryDemo[2193:f803] {
hello = 5;
world = 6;
}

三、类别的局限性
有两方面局限性:
(1)无法向类中添加新的实例变量,类别没有位置容纳实例变量。
(2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法。

四、类别的作用
类别主要有3个作用:
(1)可以将类的实现分散到多个不同文件或多个不同框架中,方便代码管理。也可以对框架提供类的扩展(没有源码,不能修改)。
(2)创建对私有方法的前向引用:如果其他类中的方法未实现,在你访问其他类的私有方法时编译器报错这时使用类别,在类别中声明这些方法(不必提供方法实现),编译器就不会再产生警告
(3)向对象添加非正式协议:创建一个NSObject的类别称为“创建一个非正式协议”,因为可以作为任何类的委托对象使用。

Extension(扩展)
一、概述
Extension是Category的一个特例。
起名字为匿名,并且添加的方法一定要实现。(category可以不实现)。因此又叫匿名分类。可以为一个类添加额外的变量,方法或者合成属性。

二、示例
1. 声明扩展

@interface MyObject(){    int iextension;}-(void)testInExtension;// 类的mainimplementation不实现的话,有编译警告。@end
  1. 实现扩展
implementation@implementation MyObject-(void)testInExtension{}@end

主要区别是:
1、形式上来看,extension是匿名的category。
2、extension里声明的方法需要在mainimplementation中实现,category不强制要求。
3、extension可以添加属性(变量),category不可以。

1 0
原创粉丝点击