Objective-CiOS 开发 将来跳槽用

Category和EXtension

2016-04-25  本文已影响355人  wg689

Category

用于给class及其subclass添加新的方法

有自己单独的 .h 和 .m 文件

用于添加新方法,而不能添加新属性(property) 类别中增加了成员,编译时可以通过,一切perfect  等到运行的时候会崩溃,会说找不到方法,类别中需要使用的成员放到 主文件中

主文件中可以self 直接调用类别的方法

为什么对类进行扩展的feature被称作category?该名称应该反映了某种初衷,那就是当某个类比较复杂庞大时,我们可以对它的功能(也就是成员函数)进行分类,并且把它们放入不同的文件加以实现。

Extension

Objective-C 2.0之后增加了Extension,所谓的扩展,其实为一个类添加额外的方法或者属性,这些方法和属性是私有的。而我们又常常把Extension成为匿名的Category。类扩展是在.m文件中声明私有方法非常好的方式。类扩展中的声明的方法与在类中声明的方法是完全一致的,需要在该类的@implementation中实现,该方法只在该类内部可见,对外不可见。Extension常被称为是匿名的Category

用于给类添加新方法,但只作用于原始类,不作用于subclass

只能对有implementation源代码的类写Extension,对于没有implementation源代码的类,比如framework class,是不可以的

Extension可以给原始类添加新方法,以及新属性

我们来简单区分一下Category类别和Extension扩展的区别:

(1)从某个类新建一个Category,会生成"类名称+Category名称".h和"类名称+Category名称".m两个文件;而从某个类新建一个Extension,只会生成一个"类名称_Extension.h"一个文件。

(2)Category中不可以定义属性或者变量;而Extension中可以定义属性或者变量。

(3)在Category中定义的方法可以被子类继承;而Extension中定义的方法和属性不能被子类继承,因为它们是private的。

(4)Category可以对自定义的类或者framework框架中的类增加方法;而Extension只能对自定义的类进行增加方法,因为你无法在框架类的实现文件中实现这些增加的方法,毕竟OC不是开源的,这些代码不可见。

(5)Category的名字是@interface 类名(Category名称),@implementation 类名(Category名称);而Extension名字只有@interface 类名();

(6)可以把Extension理解为特殊的Category;

以下就是Extension的应用,项目中很多都会用的  

#import "Person.h"

//定义一个Extension;

@interface Person ()

//对于普通变量,不能使用strong,retain,copy,只能使用assign;

@property(nonatomic,assign) int age;

//这是可以理解为private 类型的方法;只可以在该类@implementation内部调用;对外部不可见;

- (void)printName;

- (void)printAge;

@end

//类的实现文件;

@implementation Person

- (instancetype)initWithName:(NSString*)aName{

//使用父类的方法来初始化对象;

self = [super init];

if (self) {

//设置该对象的属性值;

self.name = aName;

self.age = 23;

}

//这里返回出去的是一个对象;

return self;

}

- (void)print{

NSLog(@"Person print");

[self printName];

[self printAge];

}

//实现Extension中定义的方法;

- (void)printName{

NSLog(@"name:%@",self.name);

}

- (void)printAge{

NSLog(@"name:%d",self.age);

}

@end

参考链接:https://github.com/chenyufeng1991/Objective-C_Extension 和其他的一些网络资源

上一篇 下一篇

猜你喜欢

热点阅读