OC中类目(Catagory)和扩展(Extension)的使用

一 . html

Objective-C中的类别(Category)主要有两大功能,一个是将类的相关方法进行分组,另外一个是无需继承便可向现有的类添加新的方法以扩展其功能。 网络

例如,您所在的开发团队须要建立一个类,每一个团队成员负责类的某一部分功能,例如成员A负责编写对象的建立与释放的方法、成员B负责编写网络通讯的方法、成员C负责数据的家在与保存方法等。iOS SDK中大量使用了类别,这里以NSArray类的外部接口声明为例(代码中以...省略了其余方法的接口声明): spa

@interface NSArray : NSObject <NSCopying, NSMutableCopying, NSCoding, NSFastEnumeration>
- (NSUInteger)count;
- (id)objectAtIndex:(NSUInteger)index;  
@end

@interface NSArray (NSExtendedArray)
- (NSArray *)arrayByAddingObject:(id)anObject;
- (NSArray *)arrayByAddingObjectsFromArray:(NSArray *)otherArray;
- (NSString *)componentsJoinedByString:(NSString *)separator;
...
@end

@interface NSArray (NSArrayCreation)
+ (id)array;
+ (id)arrayWithObject:(id)anObject;
...
@end

@interface NSArray (NSDeprecated)
- (void)getObjects:(id __unsafe_unretained [])objects;
@end .net

注意类别的名字在小括号中,而且位于源类名以后。例如NSExtendedArray是类别名称,它扩展了NSArray类。
二. code

类目的格式: component

接口部分: htm

@interface 已有类 (类别名) 对象

//方法的定义 blog

..... 继承

@end

注意:类别中一般只定义新的方法。

实现部分:

@implmentation 已有类(类别名)

//方法的实现

@end

类别的实现部分能够放在类的实现文件中,也能够放在额外的实现文件中。

类目只能添加方法,不能添加实例变量。

三.

扩展的格式:

@interface 已有类 ()

//方法的定义

.....

@end

扩展能够添加实例变量,属性和方法。网上大多说扩展只能类内部用,我目前Xcode7.2,只有把扩展的接口文档写到.m里才是私有的,不然外部也是可用的。也就是说私有的方法写在.m里才能。

四。

若是不另外建立文件,直接在已有类里添加类别和扩展。(要明确在同一个类文件里是能够声明多个类的,对应的实现文件里能够实现多个类的对应属性和方法)。直接敲@i后面的根据提示来就可。

也能够另外建立文件,方法以下,不过对于扩展来讲是实现必须在原来类的实现里写。由于扩展只生成.h文件。建立文件的步骤以下:首先command+N:

接着:

File是文件名,File Types有图上给出的选项,能够选择。category和extension分别生成类目和扩展文件。生成文件后导航栏如图:

首先是category:

extension如图:

这个extension(延展)里的属性和方法外部可用,并不报错。因此要想外部不可用,只能把延展写在.m里。

另外须要注意的是,类别的数量不受限制,一个类能够有不少的类别。类别中定义的方法的优先级高于类中定义的方法,也就是说当你在类别中定义了一个与源类中的签名彻底一致的方法时,类别中的方法会彻底覆盖源类中的方法,你没法调用源类中的方法。(未验证过,摘抄的)

总结自:http://www.2cto.com/kf/201504/387630.html和http://blog.csdn.net/pucker/article/details/7387411

相关文章
相关标签/搜索